[pro] 프로그래머스 level2

(문제)

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

(설명)

각 자릿수에 대해 리프트가 최소인지 또는 최소 하강인지 결정해야 합니다.

먼저 엘리베이터를 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입니다. 단, 엘리베이터를 올리면 9가 35 -> (5) 40 -> (4) 0이 된다. 앞자리 숫자가 4 이하이므로 나중에 엘리베이터를 올리면 더 많은 마법석이 필요하다. 엘리베이터를 내립니다. 따라서 엘리베이터를 타고 내려가는 것이 유리합니다.

665번 사건을 보자. 엘리베이터에서 내리면 665 -> (5) 660 -> (4) 700 -> (3) 1000 -> (1) 0이 13점을 차지합니다. 다만 엘리베이터를 올리면 665 -> (5) 670 -> (3) 700 -> (3) 1000 -> (1) 0으로 12가 걸린다. 리프트를 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;
    }
}