본문 바로가기

프로그래머스

LV2 - 마법의 엘레베이터 (Java)

 


 

문제

 

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