언어/python

[알고리즘] 백준 2630번 - 재귀함수 문제풀이

STUFIT 2023. 2. 16. 15:07
반응형

백준 2630 번 문제는 색종이 접기 문제인데.... 진짜 이해를 초반에 못했다.

아래에는 주석을 달아둔 코드이므로 참고하자.

def count_paper(x, y, n, paper):
    """
    주어진 정사각형 종이에서 (x, y) 위치부터 시작해서
    n 크기의 정사각형을 검사하여 같은 색인 색종이의 개수를 반환하는 함수.
    """
    if n == 1: # 종이의 크기가 1x1이면 해당 위치의 색종이 1개 반환
        return [0, 1] if paper[x][y] else [1, 0]
​
    # 해당 정사각형의 색이 모두 같은지 확인
    same_color = True
    for i in range(x, x+n):
        for j in range(y, y+n):
            if paper[i][j] != paper[x][y]:
                same_color = False
                break
        if not same_color:
            break
​
    # 모두 같은 색인 경우 해당 색종이 수 반환
    if same_color:
        return [0, 1] if paper[x][y] else [1, 0]
​
    # 4등분하여 재귀적으로 색종이 수 계산
    size = n//2
    counts = [0, 0] # 하얀색, 파란색 색종이 수를 저장할 리스트
    for i in range(2):
        for j in range(2):
            result = count_paper(x+i*size, y+j*size, size, paper)
            counts[0] += result[0] # 하얀색 색종이 수 합산
            counts[1] += result[1] # 파란색 색종이 수 합산
​
    return counts
​
# 입력 받기
n = int(input())
paper = [list(map(int, input().split())) for _ in range(n)]
​
# 색종이 수 계산
result = count_paper(0, 0, n, paper)
​
# 결과 출력
print(result[0])
print(result[1])
반응형