728x90

알고리즘 챌린지 9일 차이다. 오늘은 프로그래머스 Level2에 분류된 마법의 엘리베이터 문제를 가져왔다.
https://school.programmers.co.kr/learn/courses/30/lessons/148653
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
조건을 따지는 것이 크게 어렵지 않기 때문에 손으로 몇 번 써보면 금방 문제를 풀이할 수 있을 것이다.
결론적으로 모든 자릿수의 값을 0으로 만들어야 하는데, 위로 가냐 아래로 가냐의 차이일 뿐이다. 위로 가는 경우 다음 자릿수의 값이 +1이 되기 때문에 경우의 수를 조금만 더 꼼꼼히 챙겨 보면 되겠다.
- 5층보다 높은 경우 위층으로 이동한다.
- 0~9사이의 수 들이 각 자릿수에 있을 텐데 0으로 가던 10으로 가던 최소한의 움직임이어야 한다는 것을 기억하자
- 단, 이때 점검하는 수가 가장 큰 자릿라면, 마법의 돌 횟수를 한 번만 올린다.
- 7000인 경우 5보다 크기 때문에 3 * 1000 하여, 세 번의 이동으로 가능하다. 결과는 10000 * 1이므로 한 개의 돌로 이동이 가능하다.
- 그렇지 않다면 바로 윗 자릿수의 값을 1 증가시킨다.
- 1570인 경우, 5보다 크기 때문에 3 * 10하여, 이동하면 1600이 되기 때문에, 윗 자릿수의 값을 +1 해주어야 한다.
- 5층보다 낮은 경우 아래층으로 이동한다.
- 5층인 경우는 아래층으로 이동해도 되고, 위층으로 이동해도 된다. 단, 이 경우 다음 자릿수의 값을 확인해야 한다.
- 2550인 경우, 위로 이동 -> 2600 -> 4개만 더 사용하면 된다.
- 2550인 경우, 아래오 이동 -> 2500 -> 5개를 더 사용해야 한다.
- 즉, 현재 자릿수가 5인 경우, 다음 자릿 수가 있을 때 다음 자릿수가 5 이상이면 위로 이동, 보다 작다면 밑으로 이동한다.
위의 조건들 중 음영 처리가 된 부분이 실제 조건으로 사용될 부분이다. 아래 코드로 살펴보자.
Java
더보기
import java.util.*;
import java.util.stream.*;
class Solution {
public int solution(int storey) {
String tmp = String.valueOf(storey);
List<Integer> floor = Arrays.stream(tmp.split("")).map(Integer::parseInt).collect(Collectors.toList());
int answer = 0;
for(int i=floor.size()-1; i>=0; i--) {
if(floor.get(i) > 5){
answer += 10 - floor.get(i);
//제일 큰 자릿수에서 자릿수가 1증가 했다면 증가한 자릴수를 마법의 돌 사용으로 추가
if(i==0) answer++;
else floor.set(i-1, floor.get(i-1)+1); //자릿수 1증가
}else if(floor.get(i) == 5 && i > 0 && floor.get(i-1) >= 5){
floor.set(i-1, floor.get(i-1)+1);
answer += 5;
}else { //5보다 작은 경우
answer+= floor.get(i);
}
}
return answer;
}
}
728x90
'알고리즘' 카테고리의 다른 글
프로그래머스_리코쳇 로봇_Day11 (1) | 2024.02.16 |
---|---|
프로그래머스_시소짝꿍_Day10 (0) | 2024.02.15 |
프로그래머스_호텔 대실_Day8 (0) | 2024.02.13 |
프로그래머스_광물캐기_Day7 (0) | 2024.02.12 |
프로그래머스_뒤에 있는 큰 수_Day6 (0) | 2024.02.11 |