코테/프로그래머스

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

imname1am 2024. 2. 26. 15:46
반응형

📖 문제

 

프로그래머스

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

programmers.co.kr

 

 

 

💡  풀이 방식

• 그리디

 

5를 기점으로 누를 버튼을 다르게 한다.

- 4 이하의 숫자 : (-) 버튼을 누르는 게 빠르다. (내림)

- 5일 때, 앞자리의 숫자가 5 이상이면 올리도록 + 버튼을, 4 이하면 내리도록 - 버튼을 누르게 한다.

(예 : 2450 vs 2550. 2450은 2400 으로 내리는 것이 2500으로 올리는 것보다 빠르기 때문)

if(digit == 5) {   // 🔔 [앞자리 숫자 비교]
    if(storey % 10 >= 5) {  // 앞자리 숫자가 5 이상이면, + 버튼 누르는 게 빠름
        answer += (10 - digit);
        storey++;
    }
    else {  // 앞자리 숫자가 4 이하면, - 버튼 누르는 게 빠름
        answer += digit;
    }
}

 

- 6 이상의 숫자 : (+) 버튼을 누르는 게 빠르다. (올림)

 

 

💥 유의사항

- 일의 자리(오른쪽 뒤)부터 숫자를 10 단위로 만들기

 

 

🔺 코드

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
import java.util.*;
 
class Solution {
    public int solution(int storey) {
        int answer = 0;
        
        while(storey > 0) {
            int digit = storey % 10;
            storey /= 10;
            
            if(digit == 5) { // 🔔 [앞자리 숫자 비교]
                if(storey % 10 >= 5) {  // 앞자리 숫자가 5 이상이면, 올림. (+ 버튼 누르는 게 빠름)
                    answer += (10 - digit);
                    storey++;
                }
                else {  // 앞자리 숫자가 4 이하면, 내림. (- 버튼 누르는 게 빠름)
                    answer += digit;
                }
            }
            else if(digit > 5) {    // 5 이상이면 + 버튼 누르는 게 빠름
                answer += (10 - digit);
                storey++; // 🔔 다음 자릿수 + 1
            }
            else {  // 4 이하면 - 버튼 누르는 게 빠름
                answer += digit;
            }
        }        
        
        return answer;
    }
}
cs

 

 

 

➕ 다른 풀이 방식

- DFS 풀이 방식..

import java.lang.*;

class Solution {
    int MIN = Integer.MAX_VALUE;

    public int solution(int storey) {
        int answer = 0;
        int level = storey;

        DFS(storey, answer, 0);

        if (MIN != Integer.MAX_VALUE)
            answer = MIN;

        return answer;
    }

    public void DFS(int storey, int cnt, int n) {
        if (cnt > MIN) return;
        if (storey == 0) {
            MIN = cnt;
            return;
        }

        //System.out.println("1 storey=" +storey + ", cnt=" + cnt + ", n=" + n);
        int remainder = storey % 10;
        storey = storey / 10;

        DFS(storey, cnt+remainder, n+1);
        //System.out.println("2 storey=" +storey + ", cnt=" + cnt + ", n=" + n);
        DFS(storey + 1, cnt + 10 - remainder, n+1);
    }
}

 


💦 어려웠던 점

- 그리디를 오른쪽 뒤쪽(=일의 자리)부터 진행할 생각은 했는데 숫자가 5일 때 앞의 문자까지 고려할 생각을 하지 못 했다.

- 올림 처리할 때 변하는 숫자 처리 HOW...

 

🧐 새로 알게 된 내용

- 5일 때는 앞의 숫자를 기점으로 내림할지, 올림할지 결정하기

- 올림 처리할 때 앞자리 +1 하는 처리

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 친절한 설명..💚

 

프로그래머스 - 마법의 엘리베이터(Java, 자바)

문제 링크 문제 설명 마법의 세계에 사는 민수는 아주 높은 탑에 살고 있습니다. 탑이 너무 높아서 걸어 다니기 힘든 민수는 마법의 엘리베이터를 만들었습니다. 마법의 엘리베이터의 버튼은 특

hy-ung.tistory.com

 

 

마법의 엘리베이터 - 프로그래머스 LV2 Java 코딩테스트 연습

문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/148653 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁

mag1c.tistory.com

 

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/148653# 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞

aainy.tistory.com

 

반응형