공부하기/백준

[Python] 백준 풀기 2630 - 색종이 만들기

XEV 2022. 10. 10. 19:52

파이썬 백준 2630번

실버2

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

 

2630번: 색종이 만들기

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

www.acmicpc.net

 

 

 

 

문제 보기

 

 

 

문제 풀기

2차 array 형태로 모든 색종이의 맵을 저장하고 이중 for loop 를 통해 왼쪽 위 구석에서 부터 차례대로 color_check != colorpaper_ls[i][j]: 체크해 나간다. 이 때, 기준이 되는 원소는 맨 처음에 시작하는 왼쪽 위이며, 흰색 또는 파란색과 같은지를 계속 비교해 나간다. 모든 원소에 대해 첫 colorpaper_ls[x][y] 와 값이 같으면, 그것이 흰색이면 white_count += 1, 또는 그것이 파란색이면 blue_count += 1 를 누적해 나간다.

하지만, for loop 을 도는 도중 if color_check != colorpaper_ls[i][j]: 조건을 만족하여 첫 원소와 같지 않은 경우가 발생하게 되면 가로 세로 절반을 나누어 1사분면, 2사분면, 3사분면, 그리고 4사분면에 해당하는 N//2 으로 다시 함수에 적용하여 작업을 수행하고 return 으로 빠져 나온다. 같은 색으로 정사각형이 모두 이루어질때까지 재귀함수는 돌아간다.

 

주어진 맵의 형태를 두고 모든것을 스캔하여 푸는 것에 대해 개인적으로 아직 방법 확립이 안된것 같다.

 

 

코드 보기

import sys
inputdata = sys.stdin.readline

def fnCutColorpaper (x, y, N):
    global white_count, blue_count
    color_check = colorpaper_ls[x][y]
    
    for i in range(x, x + N):
        for j in range(y, y + N):
            if color_check != colorpaper_ls[i][j]:
                fnCutColorpaper(x, y, N//2)
                fnCutColorpaper(x, y + N//2, N//2)
                fnCutColorpaper(x + N//2, y, N // 2)
                fnCutColorpaper(x + N//2, y + N//2, N // 2)
                return

    if color_check == 0:
        white_count += 1
    if color_check == 1:
        blue_count += 1

if __name__ == "__main__":
    N = int(inputdata().strip())
    colorpaper_ls = [list(map(int, inputdata().split())) for _ in range(N)]
    white_count, blue_count = 0, 0
    
    # print(colorpaper_ls)            #
    
    fnCutColorpaper(0, 0, N)
    
    print(white_count)
    print(blue_count)