문제분석
목표: 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 |
'알고리즘 > 프로그래머스 Level2' 카테고리의 다른 글
[프로그래머스,Java] Level2: 택배 배달과 수거하기 (0) | 2023.01.07 |
---|---|
[프로그래머스 ,Java] Level2: 유사 칸토어 비트열 (0) | 2023.01.01 |
[프로그래머스 ,Java] Level2: 테이블 해시 함수 (0) | 2022.12.22 |
[프로그래머스, Java] Level2: 디펜스 게임 (1) | 2022.12.10 |
[프로그래머스,Java] Level2: 점 찍기 (0) | 2022.12.02 |