[파이썬] 백준 1780 : 종이의 개수

728x90

[파이썬] 백준 1780 : 종이의 개수

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

 

1780번: 종이의 개수

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

www.acmicpc.net

실버 2

분할정복, 재귀


접근

이 문제를 풀기전에 백준의 색종이 만들기 문제를 먼저 풀어보는 것이 좋다.

https://afterdawncoding.tistory.com/145

 

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

[파이썬] 백준 2630 : 색종이 만들기 https://www.acmicpc.net/problem/2630 2630번: 색종이 만들기 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색..

afterdawncoding.tistory.com

색종이 만들기에서 4번 쪼개기 위해 재귀함수를 4번 사용한 것처럼 이 문제에서도 동일 한 크기의 종이 9개로 자르기 때문에 재귀함수를 9번 사용하면 된다.

x축, x축+1/3, x축+2/3지점과

y축, y축+1/3, y축+2/3지점의 모든 경우에 대한 재귀함수를 적용하면 쉽게 풀어낼 수 있다.

 

코드 1 (5408ms)

import sys
N = int(sys.stdin.readline())
paper = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
minus, zero, one = 0, 0, 0   

def solution(x, y, N):   
    global minus, zero, one
    color = paper[x][y]    
    for i in range(x, x+N):    
        for j in range(y, y+N):
            if color != paper[i][j]:    
                next_n = N//3
                solution(x, y, next_n) 
                solution(x+next_n, y, next_n) 
                solution(x+(next_n*2), y, next_n) 
                solution(x, y+next_n, next_n) 
                solution(x, y+(next_n*2), next_n) 
                solution(x+next_n, y+next_n, next_n) 
                solution(x+(next_n*2), y+next_n, next_n) 
                solution(x+next_n, y+(next_n*2), next_n) 
                solution(x+(next_n*2), y+(next_n*2), next_n) 
                return
    
    if color == 0:    
        zero += 1
    elif color == 1:
        one += 1
    elif color == -1:
        minus += 1

solution(0, 0, N)
print(f'{minus}\n{zero}\n{one}')

 

코드 2 (6444ms)

모든 경우에 대해 이중반복문으로 재귀함수 처리를 한다. 다만 처리 속도는 더 많이 걸린다.

import sys
N = int(sys.stdin.readline())
paper = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
minus, zero, one = 0, 0, 0   

def solution(x, y, N):   
    global minus, zero, one
    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):
                        solution(x+k*N//3, y+l*N//3, N//3) 
                return    
    
    if color == 0:    
        zero += 1
    elif color == 1:
        one += 1
    elif color == -1:
        minus += 1

solution(0, 0, N)
print(f'{minus}\n{zero}\n{one}')

 

728x90