코딩테스트

프로그래머스) 지폐 접기(level 1) - Java(자바)

pogun 2025. 6. 28. 17:59

문제 설명

민수는 다양한 지폐를 수집하는 취미를 가지고 있습니다. 지폐마다 크기가 달라 지갑에 넣으려면 여러 번 접어서 넣어야 합니다. 예를 들어 지갑의 크기가 30 * 15이고 지폐의 크기가 26 * 17이라면 한번 반으로 접어 13 * 17 크기로 만든 뒤 90도 돌려서 지갑에 넣을 수 있습니다. 지폐를 접을 때는 다음과 같은 규칙을 지킵니다.

 

조건

 - 지폐를 접을 때는 항상 길이가 긴 쪽을 반으로 접습니다.

 - 접기 전 길이가 홀수였다면 접은 후 소수점 이하는 버립니다.

 - 접힌 지폐를 그대로 또는 90도 돌려서 지갑에 넣을 수 있다면 그만 접습니다.

 

지갑의 가로, 세로 크기를 담은 정수 리스트 wallet과 지폐의 가로, 세로 크기를 담은 정수 리스트 bill가 주어질 때, 지갑에 넣기 위해서 지폐를 최소 몇 번 접어야 하는지 return하도록 solution함수를 완성해 주세요.


입출력 예

wallet(지갑) bill(지폐) result(접은 횟수)
[30, 15] [26, 17] 1
[50, 50] [100, 241] 4

문제 풀이

class Solution {
    public int solution(int[] wallet, int[] bill) {
        int answer = 0;

        int walletMin = Math.min(wallet[0], wallet[1]);
        int walletMax = Math.max(wallet[0], wallet[1]);
        int billW = bill[0];
        int billH = bill[1];
        
        while(true){
            int billMin = Math.min(billW, billH);
            int billMax = Math.max(billW, billH);
            
            if((billMin <= walletMin && billMax <= walletMax) ||
              (billMin <= walletMax && billMax <= walletMin)){
                break;
            }
            
            if(billW >= billH){
                billW = billW / 2;
            } else {
                billH = billH / 2;
            }
            
            answer++;
        }
        
        return answer;
    }
}

class Main{
    public static void Main(String[] args){
        Solution s = new Solution();
        int[] wallet = {30, 15};
        int[] bill = {26, 17};
        
        int result = s.solution(wallet, bill);
    }
}

- 변수 초기화

    - 지갑 / 지폐 가로세로 구분 무시하고, 짧은 쪽과 긴 쪽 기준으로 관리

    - 지폐는 계속 접을수록 값이 변하기 때문에 계속 접을 수 있도록 변수 분리

- 접기 반복(while문)

    - 지폐가 회전 포함해서 지갑에 들어갈 수 있으면 종료

    - 양 방향 (가로x세로 / 세로x가로) 모두 비교

- 접기 로직

    - 긴 쪽만 반으로 접는다

    - 어차피 나눈 값이 int라서 소수점은 자동 버림

 

입력 : wallet = [30, 15], bill = [26, 17] (예시)

    - 1회 접기 : 13 x 17 → 회전 후 17 x 13 → 들어감

    - 접은 횟수 : 1번

 

입력 : wallet = [40, 30], bill = [300, 20] (예시)

    - 1회 접기 : 150 x 20 (300 →  150) → 안들어감

    - 2회 접기 : 75 x 20 (150 →  75) → 안들어감

    - 3회 접기 : 37 x 20 (75 →  37) → 안들어감

    - 4회 접기 : 18 x 20 (37 →  18) → 들어감

    - 접은 횟수 : 4번


 

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr