(문제)
https://school.programmers.co.kr/learn/courses/30/lessons/148653
프로그램 제작자
코드 중심 개발자를 고용하십시오. 배치 기반 위치 매칭. 프로그래머의 개발자별 프로필에 가입하고 기술 호환성이 좋은 회사와 연결하십시오.
Programmer.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입니다. 단, 엘리베이터를 올리면 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;
}
}

