알고리즘/baekjoon

[알고리즘/baekjoon] 1780_종이의 개수(python)

천뿌니 2021. 11. 23. 22:14
728x90

문제

https://www.acmicpc.net/problem/1780

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수

www.acmicpc.net

# 2630_색종이 만들기와 유사한 유형으로 색종이에서는 N/2로 나눴지만, 이 문제는 3의 배수로 처리해줘야한다.
 
import sys

N = int(sys.stdin.readline())
data = []
for _ in range(N):
  data.append(list(map(int, sys.stdin.readline().split())))
  ans = {"-1":0, "0":0, "1":0} # -1, 0, 1의 개수를 저장하는 dict

def addOrDivide(row, col, N):
    value = data[row][col] # 받아온 row,col에 해당하는 값 저장
    for i in range(N):
        for j in range(N):
            if value != data[row + i][col + j]: # 하나라도 다른값이 나왔으면 쪼개준다
                addOrDivide(row, col, N // 3)
                addOrDivide(row, col + N // 3, N // 3)
                addOrDivide(row, col + N * 2 // 3, N // 3)
                addOrDivide(row + N // 3, col, N // 3)
                addOrDivide(row + N // 3, col + N // 3, N // 3)
                addOrDivide(row + N // 3, col + N * 2 // 3, N // 3)
                addOrDivide(row + N * 2 // 3, col, N // 3)
                addOrDivide(row + N * 2 // 3, col + N // 3, N // 3)
                addOrDivide(row + N * 2 // 3, col + N * 2 // 3, N // 3)
                return
    ans[str(value)] += 1

addOrDivide(0, 0, N)
print(ans["-1"])
print(ans["0"])
print(ans["1"])