[프로그래머스] 마법의 엘리베이터(Java)

howisitgoing·2023년 4월 5일
0

프로그래머스

목록 보기
4/10

[프로그래머스] 마법의 엘리베이터(Java)

마법의 엘리베이터

해결 방법

내머리로는 해결하지 못했다..😭

여기 블로그의 코드를 보며 이해했는데,
설명하면 다음과 같습니다.

이 문제는 각 자릿수마다 엘리베이터를 올릴지, 내릴지를 판단🧐 해야합니다.
즉, Greedy 알고리즘 입니다.

각 자리수를 판단하기 위해서는 %연산을 사용하면 좋겠죠?

// 1의 자리 숫자
int oneDigit = number % 10;

올리면 무조건 이득보는 숫자는 6,7,8,9 이며,
내리면 무조건 이득보는 숫자는 0,1,2,3,4 입니다.

왜냐구요? 🤷🏻‍♂️

만약 44층이라고 하면?

  • 1층씩 6번 올라가고, 10층씩 5번 내려가기 -> 11
    • 44 -> 50 -> 0
  • 1층씩 4번 내려가고, 10층씩 4번 내려가기 -> 8
    • 44 -> 40 -> 0
  • 일의 자리 4는 5보다 작기 때문에 내리면 이득!👍

만약 47층이라고 하면?

  • 1층씩 7번 내려가고, 10층씩 4번 내려가기 -> 11
    • 47 -> 40 -> 0
  • 1층씩 3번 올라가고, 10층씩 5번 내려가기 -> 8
    • 47 -> 50 -> 0
  • 일의 자리 7은 5보다 크기 때문에 올리면 이득!👍

만약 45층 이라고 하면?

  • 1층씩 5번 올리고, 10층씩 5번 내려가기 -> 10
    • 45 -> 50 -> 0
  • 1층씩 5번 내리고, 10층씩 4번 내려가기 -> 9
    • 45 -> 40 -> 0
  • 내리는게 이득인거 같아요!

만약 55층이라고 하면?

  • 1층씩 5번 내리고, 10층씩 5번 내려가기 -> 10
    • 55 -> 50 -> 0
  • 1층씩 5번 올리고, 10층씩 4번 올리고, 100층 1번 내려가기 -> 10
    • 55 -> 60 -> 100 -> 0
  • 같은 값이 나왔네요…!😲

숫자 5인 경우에 다양한 경우가 발생합니다.🤯

555층인 경우를 볼까요? 🔎

일의 자리를 올리거나 내리기 전에 생각해봅시다.🤔 십의 자리를 한 번 봐볼까?

일의 자리를 올리면 십의 자리가 상승합니다.
555 -> 560 -> ?

일의 자리를 내리면 십의 자리가 그대로 입니다.
555 -> 550 -> ?

어떤게 더 이득일까요?
당연히 일의 자리를 올려서 십의 자리가 상승하는게 이득입니다.!
그렇습니다.!!!!
일의 자리가 5인 경우에는 십의 자리가 5이상인지 이하인지 파악해야합니다.

따라서 555층을 다음과 같이 해결할 수 있습니다.

일의 자리 숫자가 5이고, 그 앞에 십의 자리숫자가 5 이상이기 때문에 올리는게 이득 입니다. 👍
555 -> 560(5) -> 600(5 + 4) -> 0(5 + 4 + 6)

정말로 일의 자리가 5인 경우, 십의 자리숫자가 5이상 일 때 올리는게 이득일까? 🤔

우리 그러면 545층인 경우를 확인해 볼까요?

일의 자리를 올리면 십의 자리가 상승합니다.
545 -> 550 -> ?

일의 자리를 내리면 십의 자리가 그대로 입니다.
545 -> 540 -> ?

어떤게 더 이득인가요?
일의 자리를 내리는게 이득입니다.

일의 자리가 5이고, 십의 자리가 5 미만 이기 때문에 일의 자리를 내리는 게 이득 입니다.!👍
545 -> 540(5) -> 500(5 + 4) -> 0(5 + 4 + 5)

정리

  • 일의 자리 숫자(oneDigit)와 십의 자리 숫자(tenDigit) 확인
  • 일의 자리 숫자(oneDigit)가 5보다 클 경우 올림
  • 일의 자리 숫자(oneDigit)가 5일 경우 십의 자리 숫자(tenDigit)가 5 이상이면 올림, 5 미만이면 내림
  • 일의 자리 숫자(oneDigit)가 5보다 작을 경우 내림
  • storey를 10으로 나누고 위 과정 반복
    • 10으로 나눠야 다음 루프에서 일의 자리(oneDigit), 십의 자리(tenDigit)를 확인할 수 있음^^

풀이

class Solution {
    public int solution(int storey) {
        /**
         * 주어진 숫자의 일의 숫자부터 확인해야 합니다.
         *
         * 1. 일의 자리 숫자와 십의 자리 숫자 확인
         * 2. 일의 자리 숫자가 5보다 클 경우 올림
         * 2.1 일의 자리 숫자가 5일 경우 십의 자리숫자가 5이상이면 올림, 5미만일 경우 내림
         * 2.2 일의 자리 숫자가 5보다 작을 경우 내림
         * 3. storey를 10으로 나누고 1~3 과정 반복
         */
        int answer = 0;
        while (storey > 0) {
            // 일의 자리 숫자
            int oneDigit = storey % 10;
            // 십의 자리 숫자
            int tenDigit = (storey / 10) % 10;

            // 일의 자리 숫자가 5보다 크면
            if(oneDigit > 5) {
                // 일의자리 숫자만큼 돌 사용
                answer += 10 - oneDigit;
                // 올림
                storey += 10;
            }
            // 일의 자리 숫자가 5 이면
            else if(oneDigit == 5) {
                // 5만큼 돌 사용
                answer += 5;
                // 십의 자리가 5이상이면 올림
                if(tenDigit >= 5) {
                    storey += 10;
                }
            }
            // 일의 자리 숫자가 5보다 작으면
            else {
                // 일의 자리 숫자만큼 돌 사용
                answer += oneDigit;
            }

            // 10으로 나눔(나눠야 다음 루프일때 일의 자리, 십의 자리를 파악)
            storey /= 10;
        }

        return answer;
    }
}
profile
힘들면 힘을내자!!

0개의 댓글