본문 바로가기

알고리즘 공부 및 문제 풀이/프로그래머스(PRO)

[pro] 프로그래머스 level2 148653 마법의 엘리베이터 (Java) - 시뮬레이션

[문제]

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

 

프로그래머스

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

programmers.co.kr

 

[풀이]

각 자릿수마다 엘리베이터를 올리는게 최소인지, 내리는게 최소인지 판단해야 한다.

먼저 6, 7, 8, 9일 때 엘리베이터를 올린다면 각각 4, 3, 2, 1 만큼 올리고 내릴 때보다 1만큼 더 소요되므로 5, 4, 3, 2 만큼이 들 것이다. 이는 엘리베이터를 내리는 경우 6, 7, 8, 9 가 걸리는 것보다 작다. 단순히 생각해보아도 엘리베이터를 무조건 올려야 최소가 될 것이다.

반대로 4, 3, 2, 1 의 경우 엘리베이터를 내리는 경우가 무조건 최소가 된다.

고려해야 할 부분은 자릿수가 5인 경우이다. 

35인 경우를 가정해보자. 엘리베이터를 내린다면 35 ->(5) 30 ->(3) 0 으로 8만큼 소요된다. 하지만 엘리베이터를 올린다면 35 ->(5) 40 ->(4) 0 으로 9만큼 소요될 것이다. 앞의 자릿수가 4 이하이기 때문에 엘리베이터를 올린다면 후에 엘리베이터를 내리는 마법의 돌이 더 많이 소요된다. 따라서 엘리베이터를 내리는 것이 이득이다.

665인 경우를 가정해보자. 엘리베이터를 내린다면 665 ->(5) 660 ->(4) 700 ->(3) 1000 ->(1) 0 으로 13만큼 소요된다. 하지만 엘리베이터를 올린다면 665 ->(5) 670 ->(3) 700 ->(3) 1000 ->(1) 0 로 12만큼 소요될 것이다. 앞의 자릿수가 5 이상이기 때문에 5일 때 엘리베이터를 올리는 것이 이후에 더 적은 돌을 이용해서 엘리베이터를 올릴 수 있게 해준다. 

 

 

[코드]

 

import java.util.*;

class Solution {
    public int solution(int storey) {
        int answer = 0;
        //0층으로 가기 위해 필요한 마법의 돌의 최소값을 return 
        
        String s = String.valueOf(storey);
        int[] num = new int[s.length()];
        
        for(int i=0; i<s.length(); i++){
            num[i] = s.charAt(i)-'0';
        }
        
        //5555 -> 5560 -> 5600 -> 6000 -> 10000 ->0
        for(int i=s.length()-1; i>=0; i--){
            int idx = num[i];
            
            if(idx<=4){ //내리는게 최소
                answer += idx;
            }
            else if(idx>=6){ //올리는게 최소
                idx = 10-idx;
                answer += idx;
                if(i>0){
                    num[i-1]++;
                }
                else{
                    answer += 1; //0층으로 이동
                    break;
                }
            }
            else{ //5인 경우
                if(i>0){
                    if(num[i-1]>=5){ //올리는게 최소
                        answer += 5;
                        num[i-1]++;
                    }
                    else{ //내리는게 최소
                        answer += 5;
                    }
                }
                else{
                    answer += 5;
                    break;
                }
            }
        }
        return answer;
    }
}