โ 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์ด ๋ค์ด๊ฐ ๊ทธ ๋ค์ ํฐ ์ ์ฌ๊ฐํ๋ง ๋ค์ด๊ฐ๋ ๋ฑ ์ฌ๊ท ํธ์ถ์ ํ์๊ฐ ํ์ ํ ์ ๋ค(๋ถํ ์ ๋ณต์ ์ฐ๋ ์ด์ )
โ 1629 ๊ณฑ์ โ
import sys
input=sys.stdin.readline
A,B,C=map(int,input().split())
def get_power(a,b,c):
if b == 1:
return a%c
x = get_power(a,b//2,c)
if b % 2 == 0:
return ((x%c) * (x%c)) % c
else:
return ((x%c) * (x%c) * a)%c
print(get_power((A%C),B,C))
๐ด ์ ํ์ ์ธ '๋ถํ ์ ๋ณต์ ์ด์ฉํ ๊ฑฐ๋ญ์ ๊ณฑ' ์๊ณ ๋ฆฌ์ฆ. ๋ณ๋ ํฌ์คํ ์ฐธ์กฐ
โ 11819 The Shortest does not Mean the Simplest โ
def get_power_by_divisor(a,b,c):
if b == 1:
return a%c
else:
x = get_power_by_divisor(a,b//2,c)
if b%2 == 0:
return ((x%c) * (x%c))%c
else:
return ((x%c) * (x%c) * (a%c))%c
A,B,C=map(int,input().split())
print(get_power_by_divisor(A,B,C))
๐ด 1629์ ๋์ผ
โ 13171 A โ
import sys
input=sys.stdin.readline
def get_power_by_divisor(a,b,c):
if b == 1:
return a%c
else:
x = get_power_by_divisor(a,b//2,c)
if b%2 == 0:
return ((x%c) * (x%c))%c
else:
return ((x%c) * (x%c) * (a%c))%c
A=int(input())
X=int(input())
divisor = 1_000_000_007
print(get_power_by_divisor(A,X,divisor))
๐ด ์ญ์ ๋์ผ
โ 17829 222-ํ๋ง โ
import sys
input=sys.stdin.readline
N=int(input())
arr=[]
for _ in range(N):
arr.append(list(map(int,input().split())))
def pooling(arr, length):
if length == 1:
print(*arr[0])
sys.exit()
new_arr = [[10_001]*(length//2) for _ in range(length//2)]
num = length//2
for i in range(num):
start_x,start_y = 0+2*i,-2
for j in range(num):
start_y += 2
a = arr[start_x][start_y]
b = arr[start_x+1][start_y]
c = arr[start_x][start_y+1]
d = arr[start_x+1][start_y+1]
new_arr[i][j] = sorted([a,b,c,d])[-2]
pooling(new_arr, num)
pooling(arr,N)
๐ด ์ ํ์ ์ธ ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ. ๋ถํ ์ ๋ณต ์ฌ๊ท ์ฝ๋ ์ธ ๋, ํจ์ ์์ฑ ํ (1) ๋จผ์ ์ข ๋ฃ ์กฐ๊ฑด ํ์ฉํ ์ฝ๋ → (2) ๋์ผ ํจ์ ์ด๋ฆ ์จ์ ์ฌ๊ท๋ก ๋ค์ด๊ฐ๋ ์ฝ๋
๐ด ๋ถํ ์ ๋ณต ์ฌ๊ท ์ฝ๋ ์์ฑํ ๋, ์ฌ๊ท ํจ์์ ์ธ์์ ์๋ง๊ฒ ๋ค์ด๊ฐ๊ฒ๋ ๊ท์น์ ์ฐพ๋ ๊ฒ์ด ์ค์! ์ ๋ฌธ์ ๋ ์ ์ ํฌ๊ธฐ๊ฐ ์์์ง๋ฏ๋ก, 2๋ก ๋๋ ๊ธธ์ด์ ๋ฌธ์ ์ ๋ง๋ ํ๋ง ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ธ์๋ก ๋ฃ๋ ๊ฒ์ด ์ค์ํ๋ค
โ 1992 ์ฟผ๋ํธ๋ฆฌ โ
import sys
input=sys.stdin.readline
def is_zero_or_one(arr):
l=len(arr)
cmp=arr[0][0]
for i in range(l):
for j in range(l):
if cmp != arr[i][j]:
return False
return str(cmp)
N=int(input())
quad_tree,ans=[],[]
for _ in range(N):
quad_tree.append(list(map(int,input().rstrip())))
def compress(arr,l,ans):
if l>=2:
res = is_zero_or_one(arr)
if res:
ans.append(int(res))
else:
ans.append('(')
if l!=2:
a,b,c,d=[],[],[],[]
for i in arr[:l//2]:
a.append(i[:l//2])
b.append(i[l//2:])
for j in arr[l//2:]:
c.append(j[:l//2])
d.append(j[l//2:])
compress(a,l//2,ans)
compress(b,l//2,ans)
compress(c,l//2,ans)
compress(d,l//2,ans)
else:
ans.extend([arr[0][0],arr[0][1],arr[1][0],arr[1][1]])
ans.append(')')
if N != 1:
compress(quad_tree,len(quad_tree),ans)
print(*ans,sep='')
else:
print(quad_tree[0][0])
๐ด ์ ์ฌ๊ฐํ์ ํ ๋ณ์ ๊ธธ์ด๊ฐ 2์ ์ ๊ณฑ์์ด๋ฏ๋ก ์ ๋ฐ์ฉ ๋ถํ ํด๊ฐ๋ฉฐ ์ํฉ์ ๋ฐ๋ผ ๋ชจ๋ ๊ฐ์ผ๋ฉด ์ซ์๋ฅผ ๋ถ์ด๊ฑฐ๋ ๋ชจ๋ ๊ฐ์ง ์์ผ๋ฉด (๋ฅผ ๋ถ์ด๊ณ ๋ ๋ถํ ํด๊ฐ๋ฉฐ ์ ๋ณตํ๋ฉด์ ๋์ค์ ์ ๋ฐ์ดํธ ๋๋ ans list ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค. (์ ๋ต ๊ฒฐ๊ณผ๋ฅผ ์ ๋ถ์ํ๋ฉด ๋๋ค)
โ 21854 Monsters โ
import sys
input = sys.stdin.readline
MOD = 10**9+7
def get_power(a,b,c):
if b == 1:
return a%c
x = get_power(a,b//2,c)
if b % 2 == 0:
return ((x%c) * (x%c)) % c
else:
return ((x%c) * (x%c) * (a%c))%c
n=int(input())
ks=list(map(int,input().split()))
ans=0
for k in ks:
if k == 0:
ans += 1
else:
ans+=get_power(2,k,MOD)
print(ans%MOD)
๐ด 2^k์ ๋ถํ ์ ๋ณต๊ฑฐ๋ญ์ ๊ณฑ์ผ๋ก ๊ตฌํด์ ๋์ ์ผ๋ก ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค. ์ด ๋ 2^k์ MOD๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ฏ๋ก, ์ฌ๊ท๋ก ๊ตฌํ๋ ๋์ค ๊ณฑ์ ์ ์ฑ์ง์ ๋ฐ๋ผ ๋์ค๋์ค %MOD ์ฐ์ฐ์ ์งํํด ๊ตฌํ๋ค.
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Regular Expression Upper + Intermediate - 3 Solvedโ (0) | 2023.08.14 |
---|---|
โ Set/Map Upper-Intermediate I - 3 Solvedโ (0) | 2023.08.11 |
โ Number Theory Upper-Intermediate I - 9 Solvedโ (0) | 2023.02.28 |
โ BFS&DFS Intermediate I - 20 Solvedโ (0) | 2023.02.17 |
โ Combinatorics Intermediate I - 5 Solvedโ (1) | 2023.02.16 |
๋๊ธ