마법의 엘리베이터 - 프로그래머스 LV2 Java 코딩테스트 연습코딩테스트/프로그래머스2023. 1. 11. 20:51
Table of Contents
728x90
728x90
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/148653
풀이
문제 설명에서 간단하게 추론할 수 있는것은 두 가지였다.
첫 번째는 1의 자리 수 부터 순차적으로 처리해야 한다는 것이다.
내려갔을 때는 상관이 없지만 올라갔을 때, 현재 층의 값이 증가하기 때문에, 큰 자리 수부터 계산하게 되면 한번 더 처리를 해야한다.
두 번째는 돌을 적게 쓰는 최적의 방법이다.
돌을 가장 적게 쓰는 방법은 5를 기준으로 5보다 크면 올라가고, 5보다 작다면 내려가는 것이다.
그렇다면 5일 때는 어떨까 생각을했다.
단순 5 하나만 놓고보면 올라가던 내려가던 상관이없다.
하지만 올라갔을 경우, 다음 자리수가 +1이 되어버린다.
그렇기 때문에, 해당 자리수의 숫자가 5일 경우, 다음 자리 수의 숫자까지 고려해야 한다.
두 번째 입출력 예를 보자.
위의 조건대로 돌을 4개 써서 2550을 만들었다.
다음 자리수에서 올라가는 선택을 한다면, 그 다음 자리 숫자는 6이 될 것이고, 돌을 한 개 아낄 수 있다.
하지만 만약 2550이 아니라, 2450이였다면?
두 번째 자리에서 올라가는 선택을 했다면, 2500이 되어 세 번째 자리에서 돌을 한 개 더 써야하는 경우가 생겨버린다.
그래서 조건을 5일 경우, 다음 자리 수가 5 이상일 경우 올라가고, 4 이하인 경우 내려가야 할 것이다.
class Solution {
public int solution(int storey) {
String tmp = Integer.toString(storey);
int[] arr = new int[tmp.length()];
for(int i=0; i<tmp.length(); i++) {
arr[i] = tmp.charAt(i) - '0';
}
int answer = 0;
for(int i=arr.length-1; i>=0; i--) {
if(arr[i] > 5) {
answer += 10-arr[i];
if(i==0) answer++;
else arr[i-1]++;
}
else if(arr[i]==5 && i>0 && arr[i-1]>=5) {
arr[i-1]++;
answer += 5;
}
else {
answer += arr[i];
}
}
return answer;
}
}
728x90
300x250
@mag1c :: 꾸준히 재밌게
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!