티스토리 뷰

[Silver 2]  1780 : 종이의 개수 - Python(파이썬)

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

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.

www.acmicpc.net


설명

첫째줄에 N의 개수를 입력받고, 다음번 줄에 행렬의 내용을 입력받는다.

check 라는 함수를 만들어 인자로

row : 행

col : 열

N : 행 또는 열의 수

를 받는다.

이후 행렬(paper)의 첫 원소를 val의 값으로 할당하고,

val값과 다른 값이 나온 경우 (즉, 각 종이가 다른 수로 되어있는 경우 -> 같은 수가 아닌 경우)

9개의 크기로 자르고 다시 해당 종이의 첫번째 지점에서 탐색을 시작한다.

 

def check(row, col, N):
    global minus_cnt, zero_cnt, one_cnt
    val = paper[row][col]
    # 현재 종이의 색(val)과 다르면 9개로 분할하기
    for i in range(row, row+N):
        for j in range(col, col+N):
            if paper[i][j] != val:
                N = N // 3
                check(row, col, N) # 9개로 쪼개었을때 (첫번째)
                check(row, col + N , N) # 9개로 쪼개었을때 (두번째)
                check(row, col + (2 * N), N) # 9개로 쪼개었을때 (세번째)
                check(row + N , col, N) # 9개로 쪼개었을때 (네번째)
                check(row + N , col + N, N) # 9개로 쪼개었을때 (다섯번째)
                check(row + N , col + (2 * N), N) # 9개로 쪼개었을때 (여섯번째)
                check(row + (2 * N), col, N) # 9개로 쪼개었을때 (일곱번째)
                check(row + (2 * N), col + N, N) # 9개로 쪼개었을때 (여덟번째)
                check(row + (2 * N), col + (2 * N), N) # 9개로 쪼개었을때 (아홉번째)
                return
    # 현재 종이 색상에 따라 갯수 카운트
    if val == -1:
        minus_cnt += 1
    elif val == 0:
        zero_cnt += 1
    else:
        one_cnt += 1

N = int(input())

paper = [list(map(int, input().split())) for _ in range(N)]
minus_cnt, zero_cnt, one_cnt = 0, 0, 0

check(0,0,N)

print(minus_cnt)
print(zero_cnt)
print(one_cnt)

 

댓글