백준/문제풀이_python

1780 종이의 개수

휴대용치즈 2023. 1. 4. 22:41

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

 

1780번: 종이의 개수

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

www.acmicpc.net

 

 

 

 

 

 

 

 

 

 

 

 

 

 

문제 접근

분할정복 문제다.

다른 분할탐색 실버문제는 4개로 나눴지만 이문제에선 9개로 나눈다.

재귀를 활용해서 9번 쪼개면 끝

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

코드

import sys
input = sys.stdin.readline

"""
분할정복
size//3을 0번, 1번, 2번 더하는걸 반복하면서 9개로 쪼개기.

"""

minus = 0
zero = 0
plus = 0

def rec(x, y, size):
    num = arr[x][y]
    for i in range(x, x+size):
        for j in range(y, y+size):
            if num != arr[i][j]:
                #9개로 쪼개기
                rec(x, y, size//3)
                rec(x, y + size//3, size//3)
                rec(x, y + (size//3*2), size//3)
                rec(x + size//3, y,size//3)
                rec(x + size//3,y + size//3, size//3)
                rec(x + size//3,y + (size//3*2), size//3)
                rec(x + (size//3*2), y ,size//3)
                rec(x + (size//3*2), y + size//3, size//3)
                rec(x + (size//3*2), y + (size//3*2), size//3)
                return 
    if num == -1:
        global minus
        minus += 1
    elif num == 0:
        global zero
        zero += 1
    else:
        global plus
        plus += 1

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

rec(0, 0, N)
print(minus, zero, plus, end="\n")

69424KB 4472ms