본문 바로가기
코딩테스트/파이썬

[백준] 색종이 만들기 2630 (파이썬)

by 커피는아아 2021. 3. 15.
반응형

코드

# 색종이 만들기
# 쿼드 트리 문제
# 처음 리스트를 쪼개서 작은 리스트를 만드려고 했는데 이방식은 어리석은 방식이었다. 전체에서 범위만 제한해서 원하는 부분에 접근할 수 있다.
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)