문제 간단 설명
- n까지 도착해야하는 전량 구하기
- 1움직이면 전량 1들고
- 지금까지 움직인 거리 * 2배로 순간이동하는건 전력 소모 X
- 전력 제일 조금쓰고 도착해라, 몇드는지 출력
이런 문제였고, 핵심은 순간이동을 얼마나 많이하냐! 였던 것 같다.
그래서 2배뛰기 해도 괜찮은지를 판단해주려면 이제 이걸 뒤에서부터 출발하면서 , n%2 == 0
이 되는지 판단해주고 움직인 거리를 반으로 줄여주면 될 것이다.
그리고 안나눠질때는 n-1
해주면서 ans
를 +1
해주면 해결!
완성 코드
import Foundation
func solution(_ n: Int) -> Int {
var ans = 0
var n = n
while n > 0 {
if n % 2 == 0 {
n = n / 2
}
else {
n -= 1
ans += 1
}
}
return ans
}
이렇게 일단 풀이는 성공했는데, 다른 분들 코드를 보니 이걸 재귀로 풀 수 있겠구나싶었다.
개선 코드
import Foundation
func solution(_ n: Int) -> Int {
if n == 1 { return 1 }
if n % 2 == 0 { return solution(n / 2) }
return solution(n / 2) + 1
}
느낀점
앞에서부터 계산하려니까 너무 어려웠는데, 뒤에서부터 순간이동만 찝고 들어가니까 금방 풀렸던 것 같다.
나였으면 함수를 또 만들어서 카운팅도 같이 인자로 넣어줬을 것 같은데
return solution(n / 2) + 1
로 풀어준 게 좋게 느껴졌다.