[프로그래머스/Kotlin]Lv2 - 마법의 엘리베이터

2024. 3. 21. 21:10프로그래머스/Kotlin | Level2

728x90
반응형

Lv2 - 마법의 엘리베이터 (Kotlin)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 해석

+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. 문자열을 잘라서 일의자리가 가장 처음에 오도록 만들어 반복문을 돌렸다.
  2. +1을 통해 올라가는 경우 (num만큼 클릭수를 올려준다.)
    • 현재 숫자가 1~4 사이에 있다.
    • 현재 숫자가 5이면서 나보다 앞자리 숫자가 5보다 작다.
  3. 10과 -1을 통해 올라가는 경우 (10-num만큼 클릭수를 올려주고, 앞자리 숫자를 +1해준다.)
    • 현재 숫자가 6~9 사이에 있다.
    • 현재 숫자가 5이면서 나보다 앞자리 숫자가 5보다 크다.
  4. 변수 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))
}
  1. 만약 storey가 10보다 작으면, 현재 층수와(11 - 현재 층수) 중 작은 값을 선택한다.
    • 이 부분은 10층 이하일 때의 최소 이동 거리를 계산하는 부분이다.
  2. 그렇지 않으면, storey를 10으로 나눈 나머지를 현재 층으로 하고, 10으로 나눈 몫을 다음 재귀 호출의 인자로 넘겨준다. 그리고 현재 층에서의 최소 이동 거리와 (10 - 현재 층수의 일의 자리)와 다음 재귀 호출에서의 최소 이동 거리를 더한 값 중에서 작은 값을 선택한다.

Comment

내가 푼 풀이법은 시간이 오래 걸리는 풀이었다.

사람들은 어떻게 코드도 간결하고 시간도 짧게 걸리게 문제를 푸는걸까…

나도 빨리 연습해서 그런 센스가 생겼으면 좋겠다…

저런 풀이는 생각하려고 해도 생각나지 않는다 ㅠ

728x90
반응형