본문 바로가기
PS/재귀

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

by 3급우사기 2024. 2. 27.

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

 

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.

www.acmicpc.net

 

이 문제는 이렇게 풀었습니다!

풀이

분할정복, 재귀를 이용해서 푸는 문제입니다!

2차원 배열을 순서대로 검사하면서 첫번째 블럭과 색이 다르면 바로 4등분! 해서 다시 검사

4등분 하는 게 좀 어려웠는데 전달 인자로 검사 시작 하는 부분 좌표랑 크기를 넣어서 해결했습니다!  

배열 내의 색이 모두 같거나, 배열의 크기가 1이 되면 색상별로 개수를 더해줬어요~

def paper(a, b, n):
    global white, blue
    color = field[a][b]
    for i in range(a, a+n):
        for j in range(b, b+n):
            if color != field[i][j]:
                paper(a, b, n//2)
                paper(a + n//2, b, n//2)
                paper(a, b + n//2, n//2)
                paper(a + n//2, b + n//2, n//2)
                return
    if color == 0:
        white += 1
    else:
        blue += 1

global white, blue
white = 0
blue = 0
n = int(input())
field = [list(map(int,input().split())) for _ in range(n)]
paper(0, 0, n)
print(white)
print(blue)