포스트

BOJ-1992 쿼드트리

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

문제 소개

쿼드 트리는 흑백 영상을 압축하여 표현하는 데이터 구조이다.

주어진 영상이 모두 0/1으로 되어 있으면 압축 결과는 0/1이 된다.

0과 1이 영상에 섞여 있다면 영상을 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래로 나누어 압축하게 되며 그 결과는 괄호로 묶어서 표현한다.

예를 들어, 아래 영상은 (0110)으로 표현된다.

1
2
01
10

문제 풀이

재귀를 통해서 풀이하였다.

함수 is_valid()는 주어진 영상이 0 또는 1만으로 이루어져 있는지 검사한다. 0으로만 이루어져 있다면 0을, 1로만 이루어져 있다면 1을 출력하고 True를 반환하며 0과 1이 섞여 있다면 False를 반환한다.

함수 recursive()는 영상을 압축한다. 주어진 영상에 대해 is_valid()로 검사하며, 0과 1이 섞여있다면 영상을 4등분하여 각각에 대해 재귀적으로 recursive()를 호출하게 된다.

recursive()는 재귀 호출 이전에 “(“을 출력하여 괄호를 연 후 4개의 하위 영상에 대한 압축이 끝난 후 “)”를 출력하여 괄호를 닫는다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from sys import stdin
input = lambda: stdin.readline().rstrip()


# 영상 검사 함수
def is_valid(arr, n):
    t = []
    for i in range(n):
        t += list(set(arr[i]))
    if set(t) == {'0'}:
        print(0, end='')
        return True
    elif set(t) == {'1'}:
        print(1, end='')
        return True
    else:
        return False


# 압축 함수
def recursive(arr, n):
    if not is_valid(arr, n):
        # 4등분
        s = [[] for _ in range(4)]
        for i in range(n // 2):
            s[0].append(arr[i][:n // 2])
            s[1].append(arr[i][n // 2:n])
        for i in range(n // 2, n):
            s[2].append(arr[i][:n // 2])
            s[3].append(arr[i][n // 2:n])

        # 괄호 열고 닫기
        print("(", end='')
        for i in range(4):
            recursive(s[i], n // 2)
        print(")", end='')


n = int(input())
arr = [list(input()) for _ in range(n)]

recursive(arr, n)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

인기 태그