[문제]
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만큼 소요된다. 하지만 엘리베이터를 올린다면 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;
}
}
'알고리즘 공부 및 문제 풀이 > 프로그래머스(PRO)' 카테고리의 다른 글
[pro] 프로그래머스 level2 140107 점 찍기 (Java) - 시뮬레이션 (0) | 2023.03.03 |
---|---|
[pro] 프로그래머스 level2 142085 디펜스 게임 (Java) - 시뮬레이션 (0) | 2023.03.02 |
[pro] 프로그래머스 level2 152996 시소 짝꿍 (Java) - 구현 (0) | 2023.02.27 |
[pro] 프로그래머스 level2 154538 숫자 변환하기 (Java) - DP (0) | 2023.02.21 |
[pro] 프로그래머스 level2 154539 뒤에 있는 큰 수 찾기 (Java) - 스택 (0) | 2023.02.21 |