[백준] 1992번 : 쿼드트리
2021. 5. 17. 16:25ㆍ백준


접근법
- 이전에 풀어봤던 2630번과 거의 동일한 메커니즘으로 풀었다.
- 기본적으로 동작 원리는 N만큼을 검사해서 동일한 숫자로만 놓여있으면 그 숫자를 찍고, 그렇지 않으면 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래를 차례로 검사하여 압축 결과를 괄호 안에 찍는 방식이다.
- 전과 다른 점은 이 4 분할된 영상을 ()로 에워싸야 하는 것과, 왼쪽 위, 왼쪽 아래, 왼쪽 아래, 오른쪽 아래를 순차적으로 검사해야 한다는 것이다. 이 과정은 단순히 생각해보면, 4 분할하는 곳의 앞뒤로 print("(", end=""), print(")", end="")을 각각 추가해주면 끝이 난다.
- 전과 로직 자체가 거의 차이 없는 쉬운 문제인데 왜 2단계나 난이도 차이가 있는지 잘 모르겠다.
- 이 문제를 풀면서 valueError로 인해 고생을 많이 했다. sys를 import한 후에 input = sys.stdin.readline으로 지정하고 N = int(input()), paper = [list(map(int, input())) for _ in range(N)]으로 설정했다. 이 부분에서 런타임 에러(valueError)가 발생했는데 찾아보니 "readline은 EOF를 만났을 때 EOFError 대신 빈 문자열을 반환하므로, 이를 int로 변환할 때 ValueError가 발생합니다." 이런 문제점이 있다고 한다.
풀이
N = int(input())
paper = [list(map(int, input())) for _ in range(N)]
def check(i, j, n) :
temp = paper[i][j]
for x in range(i, i + n) :
for y in range(j, j + n) :
if paper[x][y] != temp :
return False
return True
def quad_tree(i, j, n) :
if check(i, j, n) :
print(paper[i][j], end="")
return
else :
print("(", end="")
quad_tree(i, j, n // 2)
quad_tree(i, j + n // 2, n // 2)
quad_tree(i + n // 2, j, n // 2)
quad_tree(i + n // 2, j + n // 2, n // 2)
print(")", end="")
return
quad_tree(0, 0, N)
결과

'백준' 카테고리의 다른 글
| [백준] 2217번 : 로프 (1) | 2021.06.03 |
|---|---|
| [백준] 10815번, 숫자 카드 (0) | 2021.05.25 |
| [백준] 2630번, 색종이 만들기 (0) | 2021.05.17 |
| [백준] 2805번 : 나무 자르기 (0) | 2021.05.07 |
| [백준] 2206번 : 벽 부수고 이동하기 (0) | 2021.04.27 |