아래 <그림 1>과 같이 여러개의 정사각형칸들로 이루어진 정사각형 모양의 종이가 주어져 있고, 각 정사각형들은 하얀색으로 칠해져 있거나 파란색으로 칠해져 있다. 주어진 종이를 일정한 규칙에 따라 잘라서 다양한 크기를 가진 정사각형 모양의 하얀색 또는 파란색 색종이를 만들려고 한다.
전체 종이의 크기가 N×N(N=2k, k는 1 이상 7 이하의 자연수) 이라면 종이를 자르는 규칙은 다음과 같다.
전체 종이가 모두 같은 색으로 칠해져 있지 않으면 가로와 세로로 중간 부분을 잘라서 <그림 2>의 I, II, III, IV와 같이 똑같은 크기의 네 개의 N/2 × N/2색종이로 나눈다. 나누어진 종이 I, II, III, IV 각각에 대해서도 앞에서와 마찬가지로 모두 같은 색으로 칠해져 있지 않으면 같은 방법으로 똑같은 크기의 네 개의 색종이로 나눈다. 이와 같은 과정을 잘라진 종이가 모두 하얀색 또는 모두 파란색으로 칠해져 있거나, 하나의 정사각형 칸이 되어 더 이상 자를 수 없을 때까지 반복한다.
위와 같은 규칙에 따라 잘랐을 때 <그림 3>은 <그림 1>의 종이를 처음 나눈 후의 상태를, <그림 4>는 두 번째 나눈 후의 상태를, <그림 5>는 최종적으로 만들어진 다양한 크기의 9장의 하얀색 색종이와 7장의 파란색 색종이를 보여주고 있다.
입력으로 주어진 종이의 한 변의 길이 N과 각 정사각형칸의 색(하얀색 또는 파란색)이 주어질 때 잘라진 하얀색 색종이와 파란색 색종이의 개수를 구하는 프로그램을 작성하시오.
import sys
input = sys.stdin.readline
def divideSquare(square):
same = False
first = square[0][0]
if len(square) == 1:
return "B" if first == "1" else "W"
firstSquare = [row[0: len(square)//2] for row in square[0 : len(square)//2]]
secondSquare = [row[len(square)//2 : len(square)] for row in square[0:len(square)//2]]
thirdSquare = [row[0: len(square)//2] for row in square[len(square)//2: len(square)]]
fourthSquare = [row[len(square)//2: len(square)] for row in square[len(square)//2 : len(square)]]
for i in range(len(square)):
for j in range(len(square[0])):
if square[i][j] != first:
return divideSquare(firstSquare)+ divideSquare(secondSquare)+divideSquare(thirdSquare)+divideSquare(fourthSquare)
return "B" if first == "1" else "W"
arr = list()
n = int(input())
for i in range(n):
inpt = list(map(str, input().split()))
arr.append(inpt)
ans= divideSquare(arr)
print(ans.count("W"))
print(ans.count("B"))
난이도에 비해 코드 작성 시간이 오래 걸렸던 문제였다. 재귀함수를 이용해 주어진 2차원 배열 전체를 탐색하는데 모두 같은 색이 아니라면 사 등분 해서 4개의 함수를 호출해준다. 모든 원소가 같거나 종이가 1*1이 될 때까지 재귀호출을 하고 조건이 충족되면 종이의 색상 "B" 또는 "w"를 반환해 주는데 숫자로 반환을 하게 되면 어떤 것이 하얀색인지 파란색인지 구분하기가 어려울 것 같아서 문자열로 반환을 해준 다음에 반환된 문자열에서 "B"의 개수와 "W"의 개수를 출력하였다.