
문제
https://school.programmers.co.kr/learn/courses/30/lessons/148653#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
설명은 좀 복잡하지만, 결국 각자리를 0으로 만드는 과정을 거쳐 최종값 0을 만드는 문제이다.
단 여기서 신경써야할거는, 다음 자릿수로의 올림이다.
만약 지금 내가 보고 있는 자릿수가 9라면 0으로 올릴테고, 다음 자릿수에 1을 더하게 될 것이다.
만약 다음 자릿수가 일반적인 숫자면 1만 더해주고 반복을 해주면 되겠지만 9라면?
9일 경우에는 숫자가 더해져 0이 될거고, 그러면 이 자릿수에 대한 로직 처리는 따로 필요가 없다.
따라서 그냥 넘겨버리면 된다.
두번째 상황은 가장 앞자리가 올림이 일어났을때이다.
999같은 경우에, 1층을 올라가면 1000이 된다. 그러니까 숫자의 길이가 늘어난다.
이 부분을 고려해서, 1의자리에서 가장 앞자리수까지 순회를 다 돌았는데 올림 플래그 같은 값이 있다면 위와 같이 가장 앞자리수가 9인 경우일것이다. 이 경우에는 답에 +1만 해주면 된다.
마지막으로 세번째는 내가 보고 있는 숫자가 5일때이다.
5는 위로나 밑으로나 같은수만큼 이동하기 때문에 다음 자릿수를 보고 판단해야한다.
이때 다음자리 숫자가 5이상일 경우에는 올림을 시키는게 더 효율적이고, 그렇지 않다면 내림을 하는게 더 효율적이다.
예로
45 일 경우에 5 다음 자릿수가 4이기 때문에
45 -> 40 -> 0 으로 만드는게 효율적이다. (총 9회)
만약 올려버린다면
45 -> 50 -> 0 으로 총 10회를 수행하게 된다.
앞자리가 5보다 큰 경우는 어떨까?
865에서
내릴경우, 865 -> 860 -> 900 -> 1000 -> 0 (5 + 4 + 1 + 1 = 11)
올릴경우, 865 -> 870 -> 900 -> 1000 -> 0 (5 + 3 + 1 + 1 = 10)
이와 같이 앞자리에도 신경을 조금써주어서 문제를 풀면 풀 수 있다!
코드
import java.util.*;
class Solution {
public int solution(int storey) {
int answer = 0;
String[] nums = String.valueOf(storey).split("");
boolean flag = false;
for(int i=nums.length-1; i>=0; i--){
int targetNumber = Integer.parseInt(nums[i]);
// 아랫자리에서 올림이 있었더라면
if(flag){
if(targetNumber == 9) continue;
else targetNumber +=1;
}
if(targetNumber < 5){
answer += targetNumber;
flag = false;
}
if(targetNumber > 5){
answer += (10-targetNumber);
flag = true;
}
if(targetNumber == 5){
if(i == 0) answer += targetNumber;
else{
if(Integer.parseInt(nums[i-1]) >= 5 ){
flag = true;
} else{
flag = false;
}
answer += targetNumber;
}
}
}
if(flag) answer +=1;
return answer;
}
}
후기
예외처리가 까다로운 문제 아니였나 싶다..
그래서 코드도 지저분..
'프로그래머스' 카테고리의 다른 글
LV2 - 호텔 대실 (Java) (0) | 2024.07.03 |
---|---|
LV2 - 전력망을 둘로 나누기 (Java) (0) | 2024.07.02 |
LV2 - 소수 찾기 (Java) (0) | 2024.06.27 |
LV2 - 다리를 지나는 트럭 (Java) (0) | 2024.06.26 |
LV2 - 숫자 변환하기 (Java) (0) | 2024.06.25 |