๐ด DAC ๋ถํ ์ ๋ณต ๋ฌธ์ ๋ ์ฃผ๋ก ์ฌ๊ท๋ฅผ ์ฌ์ฉํด ์ฌ๋ฌ ๊ฐ์ sub-problem์ ๋๋ฆฌ๊ณ ์ฐจ๋ก์ฐจ๋ก ํด๊ฒฐํด๋๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ค์๊ธ ์ด์์ ๋์ด๋๋ถํฐ ์ฐจ๋ก๋๋ก ํ์ํด๋ณด์!
๐ด ์๋ DAC ์ด๋ก ํฌ์คํ ์ฐธ์กฐ
โ 2630 ์์ข ์ด ๋ง๋ค๊ธฐ โ
import sys
input=sys.stdin.readline
N=int(input())
W,B=0,0
confetti=[]
def is_check(arr):
side=len(arr)
if all(arr[i][j] == 0 for i in range(side) for j in range(side)):
return 'W'
elif all(arr[i][j] == 1 for i in range(side) for j in range(side)):
return 'B'
else: return 0
def get_confetti(arr,l,W,B):
if l == 1:
if arr[0][0] == 0:
W+=1
return (W,B)
else:
B+=1
return (W,B)
else:
if is_check(arr) == 'W':
W+=1
return (W,B)
elif is_check(arr) == 'B':
B+=1
return (W,B)
else:
border = l//2
arr1,arr2,arr3,arr4=[],[],[],[]
for i in arr[:border]:
arr1.append(i[:border])
arr2.append(i[border:])
for j in arr[border:]:
arr3.append(j[:border])
arr4.append(j[border:])
W,B = get_confetti(arr1,border,W,B)
W,B = get_confetti(arr2,border,W,B)
W,B = get_confetti(arr3,border,W,B)
W,B = get_confetti(arr4,border,W,B)
return (W,B)
for _ in range(N):
confetti.append(list(map(int,input().split())))
l = len(confetti)
W,B = get_confetti(confetti,l,0,0)
print(W,B,sep='\n')
๐ด ์ฃผ์ด์ง ์ ์ฌ๊ฐํ์ด ๋ชจ๋ 1๋ก ์ด๋ฃจ์ด์ ธ ์๋์ง, 0์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋์ง ํ์ธํ๋ sub-problem์ผ๋ก ๋ถํ ํ ์ ์์ผ๋ฉฐ, ํ ๋ฒ ํ์ธ๋, ์ฆ ํ ๋ฒ ํด๊ฒฐ๋ sub-problem์ ์ดํ ๋ค์ ํ๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก ๋ถํ ์ ๋ณต DAC ์๊ณ ๋ฆฌ์ฆ์ด๋ผ ํ ์ ์๋ค.
๐ด ์ฌ๊ท๋ฅผ ์ฌ์ฉ ์ ์ฃผ์์ - ๋์ผ ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ฌ๋ฌ ๋ฒ ์ธ ๋๋ง๋ค, ๋ณ์ W, B๊ฐ ๊ณ์ ์ด๊ธฐํ๋๋ฏ๋ก ์๋กญ๊ฒ ์๊ธฐ๋ sub-problem์ ํด๊ฒฐํ ๋๋ง๋ค W,B ๋ณ์์ ๊ณ์ updateํด์ค์ผ ํ๋ค.
โ 1780 ์ข ์ด์ ๊ฐ์ โ
import sys
input=sys.stdin.readline
N=int(input().rstrip())
papers=[list(map(int,input().split())) for _ in range(N)]
cnt_dic={'-1':0, '0':0, '1':0}
l=len(papers)
def check_the_same(arr):
cmp=arr[0][0]
l=len(arr)
flag=True
for i in range(l):
for j in range(l):
if arr[i][j] != cmp:
flag = False
return (False,2)
if flag:
return (True,cmp)
def cut_paper(arr,l):
if l == 0:
res,val=True,arr[0]
else:
res,val = check_the_same(arr)
if res:
if val == -1: cnt_dic['-1']+=1
elif val == 0: cnt_dic['0']+=1
else: cnt_dic['1']+=1
return
else: #if False, recursion
#divide into 9 pieces
l=len(arr)
if l > 0:
arrays=[[] for _ in range(9)]
for i in arr[:l//3]:
arrays[0].append(i[:l//3])
arrays[1].append(i[l//3:(2*l)//3])
arrays[2].append(i[(2*l)//3:l])
for i in arr[l//3:(2*l)//3]:
arrays[3].append(i[:l//3])
arrays[4].append(i[l//3:(2*l)//3])
arrays[5].append(i[(2*l)//3:l])
for i in arr[(2*l)//3:l]:
arrays[6].append(i[:l//3])
arrays[7].append(i[l//3:(2*l)//3])
arrays[8].append(i[(2*l)//3:l])
for subarr in arrays:
cut_paper(subarr,l//3)
return
cut_paper(papers,len(papers))
print(cnt_dic['-1'])
print(cnt_dic['0'])
print(cnt_dic['1'])
๐ด ์์ ๋์ผํ ์ ํ์ ์ธ ๋ถํ ์ ๋ณต ๋ฌธ์ ๋ก, ๋ถํ ํ๊ณ , recursion์ ๋ฐ๋ณตํด ์ ๋ณต ์ ํ์ผ๋ก ํด๊ฒฐํ๋ค.
๐ด ๋ค๋ง, arr์ ๊ฐ์๊ฐ 1๊ฐ์ผ ๊ฒฝ์ฐ, ๋ฐ๋ก ๊ฐ์ ์ถ๋ ฅํ๊ฒ ํ์๊ณ , ์ ์ฒด -1์ ๊ฐ์, 0์ ๊ฐ์, 1์ ๊ฐ์๋ฅผ ๋งค๋ฒ ์ ๋ฐ์ดํธํ๋ฉฐ ์ฌ๊ทํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ง ์์ ๋์ , ๊ฐ ์ข ๋ฅ์ ๊ฐ์๋ฅผ ๋์ ๋๋ฆฌ ์๋ฃํ์ผ๋ก ๋ง๋ค์ด ๊ฐ์๋ฅผ ์ ๋ฐ์ดํธํ๋ ํ์์ผ๋ก ์ฝ๋ ์งํ
๐ด ์ ์ฒด arr ์์ฒด๋ฅผ ์ชผ๊ฐ๊ธฐ ๋ณด๋ค๋, indexing์ผ๋ก arr์ ๊ฐ๊ฒฉ size๋ฅผ ์กฐ์ ํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค๋ฉด ๋ ํจ์จ์ ์ผ๋ก ์งค ์ ์๋ค.
(for๋ฌธ์์ arr์์ฒด๋ฅผ ๋ฐ๋ณตํ๊ธฐ ๋ณด๋ค, length ์ฌ์ด์ฆ ์์ฒด๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ธ ๊ฒ ์ฒ๋ผ)
โ 1074 Z โ
import sys
N,r,c=map(int,input().split())
size = 2**N
global n
n = 0
i,j=0,0
def if_size_two(i,j):
if (i,j) == (r,c):
print(n)
sys.exit()
elif (i,j+1) == (r,c):
print(n+1)
sys.exit()
elif (i+1,j) == (r,c):
print(n+2)
sys.exit()
else:
print(n+3)
sys.exit()
def divide_into_four(i,j,size):
global n
if size == 2:
if_size_two(i,j)
else:
#1
if i<=r<(i+size//2) and j<=c<(j+size//2):
divide_into_four(i,j,size//2)
else:
n+=((size//2)*(size//2))
#2
if i<=r<(i+size//2) and j+size//2<=c<(j+size):
divide_into_four(i,j+size//2,size//2)
else:
n+=((size//2)*(size//2))
#3
if i+size//2<=r<(i+size) and j<=c<(j+size//2):
divide_into_four(i+size//2,j,size//2)
else:
n+=((size//2)*(size//2))
#4
if i+size//2<=r<(i+size) and j+size//2<=c<(j+size):
divide_into_four(i+size//2,j+size//2,size//2)
else:
n+=((size//2)*(size//2))
divide_into_four(i,j,size)
๐ด Z ํ์ ํ๋ฆ
→ ์ ์ผ์ชฝ → ์ ์ค๋ฅธ์ชฝ → ์๋ ์ผ์ชฝ → ์๋ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ ์์๋ก ํ์์ด ์งํ๋๋ค.
๐ด pseudo-code ํ๋ฆ
โ size(์ ์ฌ๊ฐํ ํ ๋ณ์ ๊ธธ์ด)๊ฐ 2์ด๋ฉด ์ Z ์์๋ก ์ผ์นํ๋ (r,c) ํ์ ํ๊ณ ๋ฐ๋ก sys.exit()์ผ๋ก ์ข ๋ฃ!
โก size๊ฐ 2๊ฐ ์๋๋ผ๋ฉด 4๋ฑ๋ถ → Z ์์๋ก ์ ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋๋ก target์ด ์๋ ์ง ํ์ธ
โซ (1) ์๋ค๋ฉด โ ๋ถํฐ ๋ค์ ์ฌ๊ท → ์๋ ๊ณณ๋ง ๊ณ์ ํ (depth-first search)
โซ (2) ์๋ค๋ฉด ์ ์ญ๋ณ์ n ๊ทธ๋งํผ size๋ฅผ 2๋ก ๋๋ ๊ฐ์ ์ ๊ณฑ์ ๋ํ๊ณ , ๊ทธ ๋ค์ ๋ฐฉํฅ ํ์ (๋ฐ๋์ target์ด 4๋ฑ๋ถํ ๊ณณ ์ค ํ ๊ตฐ๋ฐ์ ์์)
โป ์ฃผ์์ ! 4๋ฑ๋ถํ ๋ ๋ง๋ค ์์์ (i,j)๊ฐ ๊ณ์ ๋ฐ๋๋ฏ๋ก updateํ (i,j)๋ฅผ ์ฌ๊ทํจ์ ์ธ์์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค
โป ๋ฐ๋์ pseudo-code ํ๋ฆ์ ๋จผ์ ๊ทธ๋ฆฐ ๋ค์ ์ฝ๋ฉ ์งํํ๊ธฐ
๐ด ์๊ฐ์ด๊ณผ ์ฝ๋
import sys
N,r,c=map(int,input().split())
size = 2**N
global n
n = 0
i,j=0,0
flag=False
def draw_Z(i,j,size):
if size==2:
global n
if i<=r<=(i+1) and j<=c<=(j+1):
if (i,j) == (r,c):
flag = True
print(n)
sys.exit()
elif (i,j+1) == (r,c):
flag = True
print(n+1)
sys.exit()
elif (i+1,j) == (r,c):
flag = True
print(n+2)
sys.exit()
else:
flag = True
print(n+3)
sys.exit()
n += 4
return
else:
draw_Z(i,j,size//2)
draw_Z(i,j+size//2,size//2)
draw_Z(i+size//2,j,size//2)
draw_Z(i+size//2,j+size//2,size//2)
draw_Z(i,j,size)
→ ๋๋ฌด ๋ง์ด ๊น๊ฒ ๋ค์ด๊ฐ๋ค. ์ธ๋ฐ์์ด ๊น๊ฒ ๋ค์ด๊ฐ๋ค.
→ ์ํ๋ target์ด ์๋ฅผ ๋ค์ด 35๋ผ๋ฉด, ์๊ฐ์ด๊ณผ ์ฝ๋๋ ๊ธธ์ด๊ฐ 2์ธ ์ ์ฌ๊ฐํ์ ์ฐจ๋ก๋๋ก ์ผ์ผ์ด ๋ค ์์๋ณด๊ณ ์ผ๋ช ๋ ธ๊ฐ๋ค์ฑ์ผ๋ก ๊ณ์ ํ์ํ๋ค.
→ ํ์ง๋ง ๋งํ ์ฝ๋๋ target์ด ๋ค์ด๊ฐ ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ ๋จผ์ ๋ค์ด๊ฐ๊ณ , target์ด ๋ค์ด๊ฐ ๊ทธ ๋ค์ ํฐ ์ ์ฌ๊ฐํ๋ง ๋ค์ด๊ฐ๋ ๋ฑ ์ฌ๊ท ํธ์ถ์ ํ์๊ฐ ํ์ ํ ์ ๋ค.
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Regular Expression ์ค์๊ธ - 2๋ฌธ์ ()โ (0) | 2023.08.14 |
---|---|
โ Set/Map Upper-Intermediate I - 2 Solvedโ (0) | 2023.08.11 |
โ Number Theory Upper-Intermediate I - 8 Solvedโ (0) | 2023.02.28 |
โ BFS&DFS Intermediate I - 17 Solvedโ (0) | 2023.02.17 |
โ Combinatorics Intermediate I - 3 Solvedโ (1) | 2023.02.16 |
๋๊ธ