[BOJ] 1992 쿼드트리

분할 정복


해당 문제는 주어진 인풋이 2의 N승에, 그래프구조이다 → 분할정복으로 해결할 수 있는지 고민해보자.

이 문제는 일반적인 분할 정복과 크게 다를 것이 없는데, 나는 출력할 때 어떻게 해야 하나 고민했다. 그래서 재귀에 대해서 언제 괄호를 열고 닫아야 하나 고민을 했다. 서브문제를 풀기 전에 괄호를 열고 서브 문제가 다 해결되면 괄호를 닫는 방향으로 구현했다.

import sys

def is_same_num(l, r, t, b):
    color = graph[t][l]
    for i in range(t, b):
        for j in range(l, r):
            if graph[i][j] != color:
                return False
    return True

def divide(left, right, top, bottom):
    # 만약 한칸만 남은 상태면
    if left == right - 1 and top == bottom - 1:
        stack.append(graph[top][left])
        return
    # 모든 타일이 같다면
    if is_same_num(left, right, top, bottom):
        stack.append(graph[top][left])
        return
    # 더 분할해야 함
    mid_lr = (left + right) // 2
    mid_tb = (top + bottom) // 2
    stack.append('(')
    divide(left, mid_lr, top, mid_tb)
    divide(mid_lr, right, top, mid_tb)
    divide(left, mid_lr, mid_tb, bottom)
    divide(mid_lr, right, mid_tb, bottom)
    stack.append(')')

if __name__ == "__main__":
    N = int(sys.stdin.readline().rstrip())
    graph = list()
    for _ in range(N):
        graph.append(list(sys.stdin.readline().rstrip()))
    stack = list()
    divide(0, N, 0, N)
    answer = ''.join(stack)
    print(answer)