분할 정복
import sys
n = int(sys.stdin.readline().rstrip())
mapp = []
for i in range(n) :
mapp.append(list(map(int, sys.stdin.readline().split())))
cnt_zero=0; cnt_mn=0; cnt_pl=0
# 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용
def all_same(rr,cc,length_of_side): # r,c 는 맨 왼쪽 꼭지점
chk = mapp[rr][cc]
for i in range(rr, rr+length_of_side) :
for j in range(cc, cc+length_of_side) :
if mapp[i][j]!=chk : return False
else : return True
# 9개로 자르고
def nine_cut(r,c,length_of_side) :
global cnt_zero,cnt_mn,cnt_pl
if all_same(r,c,length_of_side) :
# 이 종이의 처음 아이 구해서
if mapp[r][c] == 0 : cnt_zero+=1
elif mapp[r][c] == 1 : cnt_pl+=1
else : cnt_mn+=1
else :
for i in range(3) :
for j in range(3) :
nine_cut(
r+(length_of_side//3)*i, //이거 넘겨주는 부분을 잘못 썼었음
c+(length_of_side//3)*j,
length_of_side//3
)
nine_cut(0,0,n)
print(cnt_mn); print(cnt_zero); print(cnt_pl)
import sys
n = int(sys.stdin.readline().rstrip())
mapp = []
for i in range(n) :
mapp.append(list(map(int, sys.stdin.readline().split())))
# 지도 안에 -1,0,1 갯수
def cnt_mapp(mapp) :
res_minus=0; res_zero=0; res_plus=0
for m in mapp :
for mm in m :
if mm==-1 : res_minus+=1
elif mm==0 : res_zero+=1
else : res_plus+=1
return res_minus, res_zero, res_plus
# 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용
def all_same(mapp):
impossible = False
chk = mapp[0][0]
for m in mapp:
if impossible: break
for mm in m :
if mm!=chk :
impossible=True;break
return impossible
# 9개로 자르고
def nine_cut(mapp) :
lenn = len(mapp)
for i in range(3) :
for j in range(lenn*i, lenn*i+3) :
# 012 345 678 일케 나눈 상황
for k in range(3) :
for w in range(lenn*i, lenn*i+3) :
mapp[j][w]
if all_same(mapp) : m,z,p = cnt_mapp(mapp); print(m);print(z);print(p)
else :
아이디어 출처 : https://zidarn87.tistory.com/385
import sys
n = int(sys.stdin.readline().rstrip())
mapp = []
for i in range(n) :
mapp.append(list(map(int, sys.stdin.readline().split())))
cnt_zero=0; cnt_mn=0; cnt_pl=0
# 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용
def all_same(r,c,length_of_side): # r,c 는 맨 왼쪽 꼭지점
chk = mapp[r][c]
for i in range(r, r+length_of_side) :
for j in range(c, c+length_of_side) :
if mapp[i][j]!=chk : return False
else : return True
def cnt_map(r,c,length_of_side) :
global cnt_zero,cnt_mn,cnt_pl
# all same 이면 이제 그 구간은 불변이므로 갯수세주기
for i in range(r, r+length_of_side) :
for j in range(c, c+length_of_side) :
if mapp[i][j] == 0 :
cnt_zero+=1
elif mapp[i][j] ==1 :
cnt_pl+=1
else : cnt_mn +=1
# 9개로 자르고
def nine_cut(r,c,length_of_side) :
if all_same(r,c,length_of_side) :
cnt_map(r,c,length_of_side)
else :
for i in range(3) :
for j in range(3) :
nine_cut(r//3+i*3,c//3+j*3,length_of_side//3)
nine_cut(0,0,n)
print(cnt_mn); print(cnt_zero); print(cnt_mn)
재귀적으로 함수 호출하면서 큰 문제를 작은 문제로 나눠가며 해결하는 알고리즘