[프로그래머스] Lv.2 마법의 엘레베이터. JAVA

osohyun0224·2023년 4월 4일
0

프로그래머스

목록 보기
5/6
post-thumbnail

안녕하세요, 주인장입니다.
프로그래머스 레벨2에 있는 "마법의 엘리베이터" 문제를 들고왔습니다..

문제 풀어보러가기

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

문제

문제:
마법의 세계에 사는 민수는 아주 높은 탑에 살고 있습니다. 탑이 너무 높아서 걸어 다니기 힘든 민수는 마법의 엘리베이터를 만들었습니다. 마법의 엘리베이터의 버튼은 특별합니다. 마법의 엘리베이터에는 -1, +1, -10, +10, -100, +100 등과 같이 절댓값이 10c (c ≥ 0 인 정수) 형태인 정수들이 적힌 버튼이 있습니다. 마법의 엘리베이터의 버튼을 누르면 현재 층 수에 버튼에 적혀 있는 값을 더한 층으로 이동하게 됩니다. 단, 엘리베이터가 위치해 있는 층과 버튼의 값을 더한 결과가 0보다 작으면 엘리베이터는 움직이지 않습니다. 민수의 세계에서는 0층이 가장 아래층이며 엘리베이터는 현재 민수가 있는 층에 있습니다.
마법의 엘리베이터를 움직이기 위해서 버튼 한 번당 마법의 돌 한 개를 사용하게 됩니다.예를 들어, 16층에 있는 민수가 0층으로 가려면 -1이 적힌 버튼을 6번, -10이 적힌 버튼을 1번 눌러 마법의 돌 7개를 소모하여 0층으로 갈 수 있습니다. 하지만, +1이 적힌 버튼을 4번, -10이 적힌 버튼 2번을 누르면 마법의 돌 6개를 소모하여 0층으로 갈 수 있습니다.

생각한 알고리즘...

해설

  1. 먼저 구하는 것이 민수의 현재 층에서 엘리베이터를 불러서 0층으로 내려가야하는 거고, 내려가기 위한 마법의 돌을 최소한으로 쓰는 것을 목표
    -> 너비우선탐색을 생각했다.

  2. 아오 진짜 저건 아이디어를 생각하기 힘들었다.
    5미만은 버리고, 5초과는 올리고, 5는 경우에 따라 둘로 나눴다.

  3. 자세한건 저 사진을 참고해주세여...

코드

import java.util.*;

class Solution {
    public int solution(int storey) {
        int answer = 0;
        
        while(storey != 0) {
            //현재 층수를 10으로 나눈 나머지를 우선 n에 저장해야한다.
            int n = storey % 10;
            //n을 가지고 가장 문제가 되는 5보다 클때(반올림) / 5일때 / 5보다 작을때(버림)의 경우를 나눈다.
            //반올림의 계산
            if(n > 5) {
                answer += 10 -n;
                storey /= 10;
                storey += 1;
            }
            //5일때는 
            //1) 일의 자리만 5라면 걍 올리기
            //2) 십의 자리까지 5라면 (1) 5이상 올리기 (2) 5미만일때 내리기 
            else if(n == 5) {
                int ex = (storey/10) % 10;                                                      
                    if(ex >= 5) {
                        //(1) 5이상 올리기
                        storey /=10;
                        storey += 1;
                    }
                    // (2) 5미만일때 내리기
                    else {
                        storey /= 10;
                    }
                    answer+=5;
        }
        //간단하게 버린다.
        else {
            answer += n;
            storey /= 10;
        }
    }
    
    return answer;
    }
}

진짜 갓 레벨1 하는애에게 레벨2는 너무 힘들다

profile
학부생 Frontend Developer

0개의 댓글