이 문제는 사실 엄청 쉬울줄 알았는데... 못풀겠더라...!
결국 구글링을 해봤는데 다른 분들의 코드를 봐도 처음엔 이해가 잘 안갔다...
그러다 Fomagran님의 코드도 확인했는데 코드를 너무 잘 짜셔서(그 전에도 몇번 도움을 받았다... 항상 감사합니다 :))
코드를 참고하고자 했다.
그런데! 코드에서 이해가 안가는 부분이 있었다.
그것은 바로 함수의 파라미터에 &를 붙이는 것과 inout이라는 키워드...! 이것이 아예 뭔지 몰라 이것부터 확인해보았다.
간단하게 그 내용을 정리하자면... 기존에 파라미터에 사용되는 값들은 전부 상수였다. 하지만 재귀라던지 func안의 func 등 여러가지 사용성으로 인해 파라미터 값을 변수로 받을 수 있도록 지원하는데... 그것이 바로 Inout 개념이다.
이렇게 두 파라미터에 inout을 붙여주면 이 파라미터 값이 상수가 아닌 변수 값이 들어오는 것으로 인식하겠다는 뜻인 것이다.
그렇게 someInt와 anotherInt라는 변수값에 &를 붙여서 파라미터로 활용해주면 된다! (&의 표시가 inout 형태의 파라미터로 사용하겠다는 뜻) 더 자세한 내용은 아래 참고한 블로그에서 아주 아주 자세히 정리를 잘해주셨다!
(Inout 참고한 블로그: https://hyunsikwon.github.io/swift/Swift-Inout-01/)
이 문제를 풀면서 생각한 논리적 흐름
- 던전을 돌 때 필요한 최소 피로와 돈 후 소모할 피로보다 k가 큰지 확인한다.
- 크다면 newK에 새로운 피로도를 할당해주고
- 탐험한 던전은 배열에서 지워준다. 그리고 다시 explore를 시작한다.(재귀)
- 만약 작다면 다음 원소의 배열로 넘어가 시작한다.(첫번째 원소 시작 -> 크다? -> 첫번째 원소 지우고 , 카운트 + 1, -> 두 번째 원소... But, 첫번째 원소 시작 -> 작다? -> 바로 다음 원소로 시작...)
- ans를 매번 그 전 ans와 count 값을 비교하여 최대값으로 최신화해준다.
* 참고한 코드
func solution(_ k:Int, _ dungeons:[[Int]]) -> Int {
var ans: Int = 0
explore(dungeons: dungeons, ans: &ans, k: k, count: 0)
return ans
}
func explore(dungeons: [[Int]], ans: inout Int, k: Int, count: Int) {
ans = max(ans, count)
for (i, dungeon) in dungeons.enumerated() {
var newDungeons:[[Int]] = dungeons
if dungeon[0] <= k && dungeon[1] <= k {
let newK = k - dungeon[1]
newDungeons.remove(at: i)
explore(dungeons:newDungeons, ans: &ans, k: newK, count: count + 1)
}
}
}
여러가지 블로그를 참고해서 코드를 살펴봤지만... 이 코드만큼 간결하고 눈에 들어오는 코드는 없는 듯 하다! 진짜 알고리즘 고수들 너무 많아... 앞으로 더 많이 참고해서 이런 논리의 흐름을 체득해야겠다.
정리(Today I Learned)
- 놀랄만큼 지금까지 알고리즘을 풀면서 파라미터로 변수를 써본 적이 없는 것 같다. 아마 이제 난이도가 좀 높아져서 재귀라던지, 복잡함을 줄이기 위한 함수의 활용이라던지가 늘어나서 필요성을 이제야 느꼈다!
- inout 변수: 상수가 아닌 변수 파라미터, 재귀 혹은 중첩된 함수문을 사용할 때 파라미터의 값을 최신화하기 위해 사용된다.
'TIL > 알고리즘 공부' 카테고리의 다른 글
프로그래머스 Lv. 2 Swift 알고리즘 - 주차 요금 계산 (0) | 2023.01.12 |
---|---|
프로그래머스 Lv. 2 Swift 알고리즘 - 오픈채팅방 (0) | 2023.01.11 |
프로그래머스 Lv. 2 Swift 알고리즘 - [3차] 압축 (0) | 2023.01.11 |
프로그래머스 Lv. 2 Swift 알고리즘 - k진수에서 소수 개수 구하기 (0) | 2023.01.11 |
프로그래머스 Lv. 2 Swift 알고리즘 - 귤 고르기 (0) | 2023.01.09 |