전공/백준
2630
yha97
2022. 12. 21. 14:50
날짜 : 2022. 12. 21
사용 언어 : python
문제
코드
import sys
n = int(sys.stdin.readline())
graph = []
w, b = 0, 0
for _ in range(n):
graph.append(list(map(int, sys.stdin.readline().split())))
def check(r, c, l):
#print(r, c, l)
default = graph[r][c] # 기준 색깔
flag = True
for i in range(r, r + l):
for j in range(c, c+l):
if graph[i][j] in range(2) and graph[i][j] != default: # 서로 다른것 발견
flag = False
break
if not flag:
break
if not flag:
check(r, c, l // 2)
check(r + (l // 2), c, l // 2)
check(r, c + (l // 2), l // 2)
check(r + (l // 2), c + (l // 2), l // 2)
return
for i in range(r, r + l):
for j in range(c, c + l):
graph[i][j] = -1 # 확인
if flag: # 색깔이 모두 일정
if default == 1: # blue
global b
b += 1
else:
global w
w += 1
return
check(0, 0, n)
print(w, b)
"""for i in graph:
print(i)"""
풀이
- 디폴트를 먼저 설정한 후에 디폴트 값과 서로 다른 경우(0 또는 1) 기준인 변의 길이를 1/2배 하는 방식으로 줄여나가면서 재귀 방식으로 풀이했다.
알게된 점
- 처음 for문으로 문제를 해결하려다 너무 난잡해지는것같아 flag를 통해 곧바로 이중 for문을 탈출하고 변의 길이를 나누어 파트마다 재귀하는 방식으로 바꾸었는데 오히려 가독성도 좋아졌고 한번에 문제가 해결됐다.
참고 사이트
-