문제 풀이/프로그래머스

[프로그래머스] 마법의 엘레베이터(JAVA)

27200 2025. 1. 21. 20:14

문제

https://school.programmers.co.kr/learn/courses/30/lessons/148653


풀이(13분)

class Solution {
    public int solution(int storey) {
        int answer = 0;
        while(storey > 0){
            int check = storey % 10;
            storey /= 10;
            if(check< 5){
                answer += check;
                continue;
            }
            if(check == 5){
                if(storey % 10 < 5){
                    answer += check;
                }else{
                    answer += 10 - check;
                    storey += 1;
                }
                continue;
            }
            answer += 10 - check;
            storey += 1;
        }
        return answer;
    }
}

 

10의 제곱 단위로 움직일 수 있기 때문에 10을 기준으로 나머지 연산을 하며 진행했다.

 

1. 10으로 나눈 뒤의 나머지를 체크한다.

1-1. 나머지가 5보다 작다면 나머지만큼 돌을 쓰게 된다.

1-2. 나머지가 5보다 크다면 10-(나머지) 만큼의 돌을 쓰고, 몫에 1을 더해준다.(한 층 올라가게 된다고 생각해야됨.)

 

여기까지만 진행을 하였고, 문제에서 틀리다는 판정을 받았다. 정확히는 1-1에서 5보다 작거나 같다면이라고 했다.

하지만 여기서 고려해보아야 할 부분은 나머지가 5일 경우 단순히 5개의 돌만 쓰고 끝나는 것이 아닌, 이 다음에 얼만큼 적게 쓸 수 있는지가 중요하다는 것이다. 

 

예를 들어 생각해보자. 65층의 경우 5층을 위해 5개의 돌을 소비하고, 다시 6층을 위해 4의 돌을 소비하고(7 8 9 10층 가서 다시 1개를 써야함), 마지막으로 1개의 돌을 소비해 총 10개를 쓰게 된다.

하지만, 5개의 돌을 소비하여 내려온 뒤 60층에서 계산을 하는 것이 아니라 5개의 돌을 소비하여 올라간 뒤 70층에서 내려오는 것으로 계산한다면? 1개를 더 적게 쓸 수 있게 되는 것이다.

 

따라서 5인 경우를 별도로 확인해서 계산하는 로직을 추가하여 맞출 수 있었다.