프로그래머스 - 마법의 엘리베이터

홍성진·2023년 2월 13일
0

프로그래머스 - 마법의 엘리베이터

숫자가 주어지면 10^n(n은 정수)을 최소한의 횟수로 더하거나 빼서 0을 만드는 문제입니다. greedy로 풀었습니다. 작은 자리수부터 처리를 해야하는데, 먼저 드는 생각은 자리수가 5 이하인 경우는 내리고 6 이상이면 올리는 방법입니다. 받아올림에 대해 생각해야하는데 6의 경우, 올릴 때 4번이 필요하고, 받아올림된 숫자를 다루는 데 많아 봐야 1번이 필요하니까 총 5번으로, 내리지 말고 올리는 것이 맞습니다.
그런데 5의 경우는, 내릴 때 5번이 필요하지만 올릴때도 5번이 필요하다는 점에 주목해야 합니다.

55 -> 50 -> 0
시작-> 5회 -> 5회
55를 예로 들면 1의 자리에서 5번 내리면 50이 되고, 10의 자리에서 5번 내리면 0이 되어 총 10회가 필요합니다.

55 -> 60 -> 100 -> 0
시작-> 5회 -> 4회 -> 1회
이번엔 올려보겠습니다. 1의 자리에서 5번 올리면 60이 되고, 10의 자리에서 4번 올리면 100이 되어 똑같이 총 10회가 필요합니다.

두 방법의 차이는 1의 자리를 처리한 후 남는게 50이냐 60이냐입니다. 이 경우는 같지만 60과 70을 비교하면 70이 더 빠르니까 내리지 말고 올려야겠죠. 30과 40을 비교하면 내려야 할거구요. 즉, 5의 다음자리 숫자가 6 이상이면 올려야한다는 결론이 나옵니다. 그럼 55의 예처럼 다음자리 숫자도 5라면 어떻게 할까요? 다음자리의 다음자리가 6 이상일 것을 대비해서 올려줘야 합니다. 올리지 말고 내려서 이득 볼 방법은 없으니까요. 예를 들면 655가 있습니다. 올리면 700 내리면 600을 처리하게 됩니다.
655 -> 660 -> *700* -> 1000 -> 0
655 -> 650 -> *600* -> 1000 -> 0

class Solution {
    public int solution(int storey) {
        int answer = 0;
        
        while (storey > 0) {
            int cur = storey % 10;
            
            if ((cur == 5 && (storey / 10) % 10 >= 5) || cur > 5) {
                answer += 10 - cur;
                storey += 10;
            } else {
                answer += cur;
            } 
            storey /= 10;
        }
        
        return answer;
    }
}

0개의 댓글