Algorithm
[프로그래머스] 쿼드압축 후 개수 세기
kindof
2021. 7. 11. 11:13
https://programmers.co.kr/learn/courses/30/lessons/68936
코딩테스트 연습 - 쿼드압축 후 개수 세기
[[1,1,0,0],[1,0,0,0],[1,0,0,1],[1,1,1,1]] [4,9] [[1,1,1,1,1,1,1,1],[0,1,1,1,1,1,1,1],[0,0,0,0,1,1,1,1],[0,1,0,0,1,1,1,1],[0,0,0,0,0,0,1,1],[0,0,0,0,0,0,0,1],[0,0,0,0,1,0,0,1],[0,0,0,0,1,1,1,1]] [10,15]
programmers.co.kr
- 백준에 있는 쿼드트리 압축 문제와 거의 똑같은 문제다. 각 구간의 시작점과 길이를 생각하는 것이 포인트인데, 이 문제에서는 2의 거듭 제곱수 형태를 하고 있으므로 재귀 호출마다 length // = 2를 해주는 식으로 진행하면 된다.
- 각 구간에서 하나라도 다른 숫자가 있다면 그 영역을 4개로 쪼개서 재귀 호출을 하고 반복문을 탈출한다.
- 각 구간의 수가 모두 같다면 그 값을 1씩 더해준다.
def quadTree(arr, x, y, length, answer):
start = arr[x][y]
flag = True
for i in range(x, x + length):
for j in range(y, y + length):
# 하나라도 다른 수가 있으면 4개로 쪼개서 재귀 호출
if start != arr[i][j]:
length //= 2
quadTree(arr, x, y, length, answer)
quadTree(arr, x, y + length, length, answer)
quadTree(arr, x + length, y, length, answer)
quadTree(arr, x + length, y + length, length, answer)
flag = False
break
# 다르다면 반복문 탈출
if not flag:
break
# 모든 수가 같다면 카운트해주기
if flag:
if start == 0: answer[0] += 1
elif start == 1: answer[1] += 1
def solution(arr):
answer = [0,0]
quadTree(arr, 0, 0, len(arr), answer)
return answer