반응형
코드
# 색종이 만들기
# 쿼드 트리 문제
# 처음 리스트를 쪼개서 작은 리스트를 만드려고 했는데 이방식은 어리석은 방식이었다. 전체에서 범위만 제한해서 원하는 부분에 접근할 수 있다.
import sys
n = int(sys.stdin.readline().rstrip())
graph = []
for _ in range(n):
graph.append(list(map(int,sys.stdin.readline().rstrip().split())))
# 잘라진 하얀색 색종이의 개수와, 파란색 색종이의 개수를 출력한다.
w_cnt = 0
b_cnt = 0
# 색종이의 칠해져있는 여부를 검사한다. 1이라면 temp_cnt 를 만들어서 파란색 으로 칠해진 개수를 검사한다.
# 만약 칠해져있는 것이 없다면 그것은 하얀색이므로 w_cnt를 증가시키고 return 한다.
# 만약 temp_cnt 가 n ** 2 와 동일하다면 전부 칠해져있는 것이므로 b_cnt를 증가시키고 리턴한다.
# 위 두 경우에 해당하지 않는다면 4등분 해서 다시 func() 함수를 재귀적으로 호출한다.
# 1이면 true로 인식 0이면 false로 인식한다?
def func(x, y, k):
global w_cnt, b_cnt # 전역변수로 선언한 이유는 두개 값을 변경하기 위해서이다. 단순히 조회만 하는 경우인 graph는 전역변수로 설정할 필요가 없다.
# UnboundLocalError: local variable 'w_cnt' referenced before assignment
temp_cnt = 0
for i in range(x,x+k):
for j in range(y,y+k):
if graph[i][j]: # graph[i][j] == 1 과 동일
temp_cnt += 1
if not temp_cnt: # temp_cnt == 0 과 동일
w_cnt += 1
elif temp_cnt == k ** 2:
b_cnt += 1
else: # 4등분하여 다시 조회 시킨다.
func(x, y, k // 2)
func(x + k//2, y, k//2)
func(x, y+ k//2, k//2)
func(x + k//2, y+ k//2, k//2)
return
# 좌표를 설정할 x , y 좌표를 보내준다. 0 0 에서 시작한다.
func(0,0,n)
print(w_cnt)
print(b_cnt)
'코딩테스트 > 파이썬' 카테고리의 다른 글
[백준] [DP] 계단오르기 2579 (파이썬) (0) | 2021.03.15 |
---|---|
[백준] [조합] N과 M(2) 15650 (파이썬) (0) | 2021.03.15 |
[백준] [정렬] 통계학 2108 (파이썬) (0) | 2021.03.14 |
[백준] [우선탐색] DFS와 BFS 1260 (파이썬) (0) | 2021.03.14 |
[백준] [큐,덱] 큐2 18258 (파이썬) (0) | 2021.03.14 |