알고리즘

프로그래머스_마법의 엘리베이터_Day9

Leo.K 2024. 2. 14. 12:35

알고리즘 챌린지 9일 차이다. 오늘은 프로그래머스 Level2에 분류된 마법의 엘리베이터 문제를 가져왔다. 

https://school.programmers.co.kr/learn/courses/30/lessons/148653

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

조건을 따지는 것이 크게 어렵지 않기 때문에 손으로 몇 번 써보면 금방 문제를 풀이할 수 있을 것이다. 

결론적으로 모든 자릿수의 값을 0으로 만들어야 하는데, 위로 가냐 아래로 가냐의 차이일 뿐이다. 위로 가는 경우 다음 자릿수의 값이 +1이 되기 때문에 경우의 수를 조금만 더 꼼꼼히 챙겨 보면 되겠다. 

  1. 5층보다 높은 경우 위층으로 이동한다. 
    1. 0~9사이의 수 들이 각 자릿수에 있을 텐데 0으로 가던 10으로 가던 최소한의 움직임이어야 한다는 것을 기억하자
    2. 단, 이때 점검하는 수가 가장 큰 자릿라면, 마법의 돌 횟수를 한 번만 올린다.
      1. 7000인 경우 5보다 크기 때문에 3 * 1000 하여, 세 번의 이동으로 가능하다. 결과는 10000 * 1이므로 한 개의 돌로 이동이 가능하다. 
    3. 그렇지 않다면 바로 윗 자릿수의 값을 1 증가시킨다.
      1. 1570인 경우, 5보다 크기 때문에 3 * 10하여, 이동하면 1600이 되기 때문에, 윗 자릿수의 값을 +1 해주어야 한다.
  2. 5층보다 낮은 경우 아래층으로 이동한다. 
  3. 5층인 경우는 아래층으로 이동해도 되고, 위층으로 이동해도 된다. 단, 이 경우 다음 자릿수의 값을 확인해야 한다.
    1. 2550인 경우, 위로 이동 -> 2600 -> 4개만 더 사용하면 된다. 
    2. 2550인 경우, 아래오 이동 -> 2500 -> 5개를 더 사용해야 한다. 
    3. 즉, 현재 자릿수가 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;
    }
}