알고리즘/프로그래머스 Level2

[프로그래머스, Java] Level2: 마법의 엘리베이터

류창 2022. 12. 30. 22:31

문제분석

 

목표:   1 ,10 ,100, 1000 ... 같은 오르내리락 할수있는 버튼을 사용하여, 최소값으로 0층가기

 

문제를 이해하셧다면, 각 자릿수마다 엘리베이터를 올릴지, 내릴지를 판단해야합니다.

 

올리면 무조건 이득보는 숫자는 6,7,8,9 이며,

내리면 무조건 이득보는 숫자는 0,1,2,3,4 입니다.

 

문제는 숫자 5입니다.

 

숫자 5일때 경우에따라서 올리는게 더 좋을때도잇고, 내릴때 더 좋을때가있습니다.

 

EX) 45 : 45인경우는 첫째자리 5를 내리는게 더 빨리 도착합니다 = 9

 

5555: 첫째자리 5를 올리는게 더 빨리 도착합니다 = 18 5555> 5560->5600->6000->10000->0 : 5+4+4+4+1=18


55: 55인 경우는 첫째자리를 올리든, 내리든 값이 똑같습니다 =10 55->60->100->0 :10 55->50->0: 10


이렇게 숫자 5인 경우는 다양한 값이 나옵니다.

 

이 기준이 해당 자릿수의 다음 숫자가 5이상인가? 에서 판별이납니다.

 

45인 경우는 일의 자리가 5이고, 십의자리가 4(5보다작음)이므로, 내리는게 더 좋고,
5555인 경우는 일의자리가 5이고 십의자리가 5(5이상) 이므로, 올리는게 더 좋습니다.

 

이 로직을 다양한 방법으로 작성이 가능하지만 필자는 조건문으로 가지치기를 하였습니다.

 

 

1.  각 자릿수를 배열로 저장하기

우선, 각자릿수의 숫자가 필요하니 배열에다 저장합시다.

 

2. 엘리베이터 올리기, 내리기

 

엘리베이터를 올릴때를 구분합니다.

 

올라갈때는

1. 무조건 상승할때와,

2. 숫자 5이며 특수한 상황에 올라갈때를 구분했습니다.

 

두 조건을 겹쳐서 한번에 쓸수있지만, 가독성이 더좋게 분리했습니다.

 

3, 마지막 숫자처리를 합니다. i=0 일땐, 다음숫자를 볼필요가없으니 따로 구분해서 처리해줍시다.

 

 

전체풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.*;
class Solution {
    public int solution(int storey) {
        int answer = 0;
       
        String str = storey+"";  
        int[] arr= new int[str.length()];
        
        //역순 저장
        for(int i=str.length()-1;i>=0;i--){
            arr[i]=str.charAt(i)-'0';
        }
        
        for(int i=arr.length-1;i>=0;i--){
            
            int cnt=arr[i];
            
            //엘리베이터 무조건 상승할때
            if(i!=0 && arr[i]>5){
                
                cnt=10-cnt;               
                arr[i-1]++;
                
            }
            
            //특수한 상황에서 상승이 필요 할때 EX)55 , 555, 5555
            if(i!=0&&arr[i]==5){
                cnt=10-cnt;  
                if(arr[i-1]>=5) arr[i-1]++;
            }
            
            //마지막 처리
            if(i==0){
                if(cnt>5){
                    cnt=10-cnt+1;
                }
            }
            
            answer+=cnt;
        }
        
        return answer;
    }
}
cs