Lv2 - 마법의 엘리베이터 (Kotlin)
문제 해석
+1 , +10, +100 … -1, -10, -100 … 의 버튼만 이용하여 최소한의 횟수로 원하는 층수에 도달하여야 한다.
예를 들어 현재 층이 60층이라면 최소한의 버튼만 눌러 0층에 도달하는 것이 목표 !!
시작 층을 기준으로 0층을 갈 수 있는 가장 최소한의 버튼 클릭 수를 구하는 문제이다.
풀이 방법
풀이 접근 과정
5를 기준으로 더 작은 경우에는 +1을 눌러서 가고, 더 큰 경우에는 +10에서 -를 해서 가도록 하는 것이 가장 최소한의 방법이라고 생각했다.
그래서 일의 자리수부터 구하는 것이 이상적이어서 가장 뒤에 있는 숫자부터 반복문을 돌았다.
원래는 %10 이런 식으로 각 자릿수를 구하는 게 이상적이지만 귀찮은 관계로 그냥 문자열 잘라서 썼다 ㅎㅎ
가장 큰 숫자부터 처리하는 것이 편해 reverse 시키기!! 아마 여기서 시간 잡아먹었을 듯…
나의 소스코드
class Solution {
fun solution(storey: Int): Int {
var answer = 0
var up = false
val s = "$storey".reversed()
s.forEachIndexed { index, c ->
val num = c.toString().toInt() + if(up) 1 else 0
if (num in 1..4 ||
(num == 5 && (index == s.length-1 || s[index+1].toString().toInt() < 5))) {
up = false
answer += num
} else if (num in 6..9 ||
(num == 5 && (index != s.length-1 || s[index+1].toString().toInt() > 5))) {
up = true
answer += (10-num)
}
}
return answer + if(up) 1 else 0
}
}
- 문자열을 잘라서 일의자리가 가장 처음에 오도록 만들어 반복문을 돌렸다.
- +1을 통해 올라가는 경우 (num만큼 클릭수를 올려준다.)
- 현재 숫자가 1~4 사이에 있다.
- 현재 숫자가 5이면서 나보다 앞자리 숫자가 5보다 작다.
- 10과 -1을 통해 올라가는 경우 (10-num만큼 클릭수를 올려주고, 앞자리 숫자를 +1해준다.)
- 현재 숫자가 6~9 사이에 있다.
- 현재 숫자가 5이면서 나보다 앞자리 숫자가 5보다 크다.
- 변수 num은 나보다 뒷자리 숫자가 10과 -1 버튼을 통해 움직였을 때, +1을 해주기 위한 용도이다.
- +1을 해주는 이유는 10 버튼을 통해 원래 있던 층을 뛰어넘었기 때문.
다른 풀이법
import kotlin.math.min
class Solution {
fun solution(storey: Int): Int = if (storey < 10) min(storey, 11 - storey) else min(storey % 10 + solution(storey / 10), 10 - storey % 10 + solution(storey / 10 + 1))
}
- 만약 storey가 10보다 작으면, 현재 층수와(11 - 현재 층수) 중 작은 값을 선택한다.
- 이 부분은 10층 이하일 때의 최소 이동 거리를 계산하는 부분이다.
- 그렇지 않으면, storey를 10으로 나눈 나머지를 현재 층으로 하고, 10으로 나눈 몫을 다음 재귀 호출의 인자로 넘겨준다. 그리고 현재 층에서의 최소 이동 거리와 (10 - 현재 층수의 일의 자리)와 다음 재귀 호출에서의 최소 이동 거리를 더한 값 중에서 작은 값을 선택한다.
Comment
내가 푼 풀이법은 시간이 오래 걸리는 풀이었다.
사람들은 어떻게 코드도 간결하고 시간도 짧게 걸리게 문제를 푸는걸까…
나도 빨리 연습해서 그런 센스가 생겼으면 좋겠다…
저런 풀이는 생각하려고 해도 생각나지 않는다 ㅠ
'프로그래머스 > Kotlin | Level2' 카테고리의 다른 글
[프로그래머스/Kotlin]Lv2 - N-Queen (1) | 2024.06.06 |
---|---|
[프로그래머스/Kotlin]Lv2 - 과제 제출하기 (0) | 2024.04.13 |
[프로그래머스/Kotlin]Lv2 - 요격 시스템 (0) | 2023.10.13 |
[프로그래머스/Kotlin]Level2 - 풍선 터트리기 (0) | 2023.02.25 |
[프로그래머스/Kotlin]Level2 - N개의 최소공배수 (0) | 2023.02.24 |