프로그래머스 코딩테스트 [ 쿼드압축 후 개수 세기 ]
Github 링크
- 이 문제는 쿼드트리를 구현하는 문제다.
- 쿼드트리는 각 내부 노드에 정확히 4개의 자식이 있는 트리 구조이며, 2차원 공간을 재귀적으로 4개의 영역으로 분할하는데 사용된다고 한다.
(출처: 프로그래머스)
- 위 그림처럼 주어진 영역으로 4개의 영역으로 분할하고, 만약 분할된 영역에 모든 요소들이 같다면 하나의 요소만 남도록 구현한다.
- 처음 이문제를 봤을때 나누는건 그래 어떻게든 나누겠는데, 저걸 어떻게 저장하지?.. 배열로 저게 되나.. dictionary를 써야하나 생각을 했지만. 다시 생각해보면 재귀함수를 사용한다면, 굳이 저장을 해야하나? 라는 생각이 들었다.
- 4개의 영역을 나누고, 나눴을때 x,y 좌표와 사이즈만 전달해준다면, 재귀함수를 통해 구할 수 있을꺼 같다는 생각으로 접근을 했다.
- 재귀 함수 로직은 아래와 같다.
import Foundation
func solution(_ arr:[[Int]]) -> [Int] {
var ans : [Int] = [0,0]
func quadTree(_ x : Int, _ y : Int, _ size : Int){
let tempNum = arr[x][y]
var allEqual = true
for i in x..<x+size{
for j in y..<y+size{
if arr[i][j] != tempNum{
allEqual = false
break
}
}
if allEqual == false{
break
}
}
if allEqual == true {
ans[tempNum] += 1
}else{
let newSize = size / 2
quadTree(x,y,newSize)
quadTree(x+newSize,y+newSize,newSize)
quadTree(x,y+newSize,newSize)
quadTree(x+newSize,y,newSize)
}
}
quadTree(0,0,arr.count)
return ans
}
- 항상 재귀함수 문제를 풀때는 저장을 어떻게 할지도 중요하지만, 재귀함수 과정에서 바로 답을 추출해낼수 있다면, 저장을 할 필요가 없으니 고려하면서 풀어도 좋을꺼 같다.