TIL/알고리즘 공부
프로그래머스 Lv. 2 Swift 알고리즘 - 쿼드압축 후 개수 세기
여의도사노비
2023. 1. 25. 12:05
728x90
오늘도 재귀와 싸웠다...
결국 스스로 풀지 못했는데...
앞 부분까진 전부 이해하고 recursive를 걸어야하는 상황에서 어떻게 진행할지 감이 안잡혀서 다른 분들의 코드를 참고했다.
(참고: https://42kchoi.tistory.com/m/374)
이 문제를 풀면서 생각한 논리적 흐름
- 먼저 배열의 원소들을 4등분해야하기 때문에 미리 4등분된 배열을 만들어두고
- 그 안에 4사분면의 위치에 맞게 원소들을 넣어주고
- 그 안의 원소들이 전부 0이거나 1이면 원소들을 모두 지우고 0 or 1의 원소만 넣어주었다.
- 이 후 하나로 합쳐지지 않은 배열을 다시 4등분으로 조각하여 Recursive를 걸어야하는데 이 부분에서 걸렸다...
- 다른 분들의 코드를 참고해보니 좀 이해가 갔다.
- 재귀를 또 4등분으로 아예 나눠서 걸어버려야하는구나..!
- 그리고 다시 배열을 반환하여 그 배열을 무는 구조가 아닌 끝까지 도달했을 때 값에 영향을 미치는 구조로 Recursive를 설계하는 것이 훨씬 나았겠구나를 깨달았다.
* 시도하던 코드
import Foundation
func solution(_ arr:[[Int]]) -> [Int] {
var arr1: [[Int]] = [[], [], [], []]
for i in 0..<arr.count {
var temp1: [Int] = []
var temp2: [Int] = []
if i < arr.count/2 {
for j in 0..<arr.count/2 {
temp1.append(arr[i][j])
}
for j in arr.count/2..<arr.count {
temp2.append(arr[i][j])
}
arr1[0] += temp1
arr1[1] += temp2
} else {
for j in 0..<arr.count/2 {
temp1.append(arr[i][j])
}
for j in arr.count/2..<arr.count {
temp2.append(arr[i][j])
}
arr1[2] += temp1
arr1[3] += temp2
}
}
for i in 0..<arr1.count {
if arr1[i].reduce(0, +) == 0 {
arr1[i] = [0]
} else if arr1[i].reduce(0, +) == arr.count * 2 {
arr1[i] = [1]
} else {
}
}
return []
}
* 참고 후 코드
import Foundation
var zeroCount = 0
var oneCount = 0
func recursive(_ arr: [[Int]], _ row: Int, _ col: Int, _ n: Int) {
let norm = arr[row][col]
for i in row..<row + n {
for j in col..<col + n {
if norm != arr[i][j] {
recursive(arr, row, col, n/2)
recursive(arr, row, col + n/2, n/2)
recursive(arr, row + n/2, col, n/2)
recursive(arr, row + n/2, col + n/2, n/2)
return
}
}
}
if norm == 1 { oneCount += 1 }
else { zeroCount += 1 }
}
func solution(_ arr:[[Int]]) -> [Int] {
let n = arr.count
recursive(arr, 0, 0, n)
return [zeroCount, oneCount]
}
정리(Today I Learned)
1. 여전히 재귀는 어렵다 ㅠㅠ