문제/백준_파이썬

166. 1780(종이의 개수) - 파이썬

sm_hope 2022. 7. 31. 11:51
import sys
input = sys.stdin.readline

N = int(input())
paper = [list(map(int, input().split())) for _ in range(N)]
result = []


def find(x, y, N):
    color = paper[x][y]
    for i in range(x, x+N):
        for j in range(y, y+N):
            if color != paper[i][j]:
                for k in range(3):
                    for l in range(3):
                        find(x + k * N // 3, y + l * N // 3, N // 3)
                return

    if color == -1:
        result.append(-1)
    elif color == 0:
        result.append(0)
    else:
        result.append(1)


find(0, 0, N)
print(result.count(-1))
print(result.count(0))
print(result.count(1))

문제요약

9개로 나누면서 온전한 N*N 색종이를 만들어라

설명

단순히 생각하면 된다.

이런 종이가 N*N 색종이로 표현이 불가능 할때,

다음과 같이 나누고 또 N*N이 되지 않을 때

이런식으로 9개씩 나눈다는 이야기이다.

 

    color = paper[x][y]

색상을 하나 픽해준다.

    for i in range(x, x+N):
        for j in range(y, y+N):
            if color != paper[i][j]:

이제 비교를 하는데 픽한 색상과 다르다면 if문 조건에 들어간다.

                for k in range(3):
                    for l in range(3):
                        find(x + k * N // 3, y + l * N // 3, N // 3)
                return

색상이 다를경우 9개로 나누어야 한다.

따라서 k와 l을 통해 9번 find함수가 실행되고

9등분한 각 부분의 첫번째를 x,y에 넣어 find를 호출한다.

    if color == -1:
        result.append(-1)
    elif color == 0:
        result.append(0)
    else:
        result.append(1)


find(0, 0, N)
print(result.count(-1))
print(result.count(0))
print(result.count(1))

각 색상을 넣고 세어 출력해준다.