TIL_250422

듀듀·2025년 4월 22일

spring_TIL

목록 보기
47/53

마법의 엘리베이터

링크텍스트

문제 설명

  1. storey는 현재 내가 있는 층이다. 엘리베이터 안에는 -1, +1, -10, +10, -100, +100과 같이 +-10^n 버튼이 있다. 0층까지 도달할 수 있는 최소 횟수 반환

시행착오 및 문제 풀이

정답 풀이

  1. storey의 뒤에서부터 살펴보기 위해 %10을 해준다. 그리고 그 다음 값을 계산해주기 위해 /10을 해준다. storey가 0이 되기 전까지 반복한다.

  2. 5보다 작으면(0,1,2,3,4) 내림버튼을 누르는 것이 효율적이다.
    -> 만약 12층이라면 -10 1번, -1 2번 총 3번이 정답이다.
    -10 2번, +1 8번 눌러도 12층이 되지만 위의 방법보다 횟수가 훨씬 많다.
    내림버튼: n

    5보다 크면(6,7,8,9) 올림버튼을 누르는 것이 효율적이다.
    -> 만약 16층이라면 -10 2번, +1 4번 총 6번이 정답이다.
    -10 1번, -1 6번 총 7번이기 때문에 정답이 아니다.
    여기서 가장 중요한 부분은 버튼을 한번 더 눌러서 거슬러 올라가는 것이기 때문에 +1을 해주어야 한다
    16층일 때, 20에서 4를 거슬러 오는 것이므로 1->2이 되어야 한다는 뜻이다.
    올림버튼: 10-n

  3. 만약 5라면 앞의 숫자로 판단한다.
    3-1. 5 앞의 숫자가 5보다 크거나 같다면(5,6,7,8,9) 이것은 절반보다 크다는 뜻이다. 그러므로 올림버튼을 누르는 것이 효율적이다.
    -> 만약 65층이라면, -100 1번 +10 3번, +1 5번 총 9번이 정답이다.
    내림버튼을 누른다면 -10 6번, -1 5번 총 11번이기 때문에 정답이 될 수 없다.
    여기서도 버튼을 한번 더 눌러서 거슬러 올라가는 것이기 때문에 +1을 해주어야 한다.
    이때 5까지 포함된 이유는 55와 같은 경우는 100/2=50보다 큰 수이기 때문이다. (이건 내 뇌피셜이다.)
    올림버튼: 10-n

    3-2. 앞의 숫자가 5보다 작다면(1,2,3,4) 내림버튼을 누르는 것이 효율적이다.
    -> 만약 25층이라면, -10 2번 -1 5번 총 7번이 정답이다.
    -100 1번 +10 7번 +1 5번은 정답이 될 수 없다.
    내림버튼: n


정답 코드

/*
storey = 현재 층 / 내가 가야하는 층: 0층
뒤에서부터 보기
0,1,2,3,4 -> - 버튼
6,7,8,9 -> + 버튼
5는 앞의 숫자와 합쳐서 판단
*/
import java.util.*;
class Solution {
    public int solution(int storey) {
        int answer = 0;
        
        while(storey != 0) {
            int n = storey % 10;
            storey /= 10;
            
            if(n < 5) {
                answer += n;
            }
            else if(n > 5) {
                answer += 10-n;
                storey++;   //더 크게 내려가서 뒷 숫자만큼 올라와야 하기 때문에 +1
            }
            else if(n == 5) {
                //5 앞의 수가 5보다 크거나 같을 경우 더 큰 숫자로 내려갔다가 올라와야 함
                if(storey % 10 >= 5) {
                    answer += 10-n;
                    storey++;
                }
                //5 앞의 수가 5보다 작은 경우 거기서 내려가야 함
                else {
                    answer += n;
                }
            }
        }
        return answer;
    }
}

힘겹게 정답.....

//5 앞의 수가 5보다 크거나 같을 경우 더 큰 숫자로 내려갔다가 올라와야 함
                if(storey % 10 >= 5) {
                    answer += 10-n;
                    storey++;
                }
                //5 앞의 수가 5보다 작은 경우 거기서 내려가야 함
                else {
                    answer += n;
                }

사실 여기서 왜 >=5 인가 한참 생각했었다. 왜냐? 55로 계산하면 5를 포함하나 안하나 10으로 똑같이 나오거든;;
근데 555로 계산하니깐 >=5로 하는 게 맞더라
또 생각해보면 555는 1000/2 = 500보다 크다. 큰 수라 할 수 있지ㅎ
아무튼 이렇게 이해하면서 풀었다 끝!@


정말 머리 터질뻔한 문제였다. 설명도 내 머릿속에서 나온대로 적어서 뭘 제대로 적은지도 모르겠다...
내 스스로 푸는 관점이 0층에서 시작했다가 storey에서 시작했다가... 헷갈려서 딱 "storey에서 시작하는 거고 우리가 가야할 곳은 0이다!" 로 생각하고 풀었더니 좀 풀리기 시작하더라
구현은 어렵진 않았지만 풀이 방법이 어려웠다 흑

0개의 댓글