[PCCE 기출문제] 9번 / 지폐 접기

이리·2024년 10월 17일
0

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/340199

문제 설명

  • 지갑과 지폐의 크기가 주어짐
  • 주어진 파라미터: int[] wallet, int[] bill
  • 지폐를 접을 때는 항상 길이가 긴쪽을 반으로 접는다.
  • 접기 전 길이가 홀수였다면 접은 후 소수점 이하는 버린다.

풀이 방식

  • 결국 지갑의 가로 세로는 의미가 없고 지폐랑 비교했을때 큰수 vs 큰수, 작은수 vs 작은수
  • 둘중 하나라도 지갑 < 지폐 일 경우 해당 수를 반으로 나눈 뒤
    다시 큰수 vs 큰수 작은수 vs 작은수 진행
  • 큰수는 큰수끼리 작은수는 작은수끼리 비교하는 함수가 있다면 편하지 않을까

코드

class Solution {
    public int solution(int[] wallet, int[] bill) {
        // [큰수, 작은수]로 정렬 
        int[] wallet_change = change(wallet);
        int[] bill_change = change(bill);
        int answer = 0; // 접는 횟수 
        
        // 왜 못들어오지?
        while(true){
            
            for(int i = 0; i < 2; i++){
                if(wallet_change[i] < bill_change[i]){
                    bill_change[i] /= 2;
                    answer++;
                  };
                bill_change = change(bill_change);
                    
            };
            
            if(wallet_change[0] >= bill_change[0] && 
              wallet_change[1] >= bill_change[1]){
                break;
            }
        }
        return answer;
    }
        
    // 순서를 바꾸는 함수 [큰수, 작은수]
    public int[] change(int[] list){
        
        if(list[1] > list[0]){
            int chg = list[1];
            list[1] = list[0];
            list[0] = chg;
        }
        return list;
    }       
}
    

⇒ 실패 테스트가 있음

지폐를 접을 때는 항상 길이가 긴쪽을 반으로 접는다. 라는 조건이 충족되지 않은것 같다.

보완 코드

class Solution {
    public int solution(int[] wallet, int[] bill) {
        // [큰수, 작은수]로 정렬 
        int[] wallet_change = change(wallet);
        int[] bill_change = change(bill);
        int answer = 0; // 접는 횟수 
        
        // 하나라도 조건을 만족하지 않는다면 
        while(wallet_change[0] < bill_change[0] || 
              wallet_change[1] < bill_change[1]){
            
            // 큰수끼리 비교했을때 큰수/2 
            if(wallet_change[0] < bill_change[0]){
                bill_change[0] =(int)(bill_change[0]/2);
                answer++;
              };
            
            // 작은수끼리 비교했을때 큰수를 나눠줘야함
            while(wallet_change[1] < bill_change[1]){
                bill_change[0] =(int)(bill_change[0]/2);
                bill_change = change(bill_change);
                answer++;
            }
            
            // 탈출 조건 
            if(wallet_change[0] >= bill_change[0] && 
              wallet_change[1] >= bill_change[1]){
                break;
            }
        }
        
        return answer;
    }
        
    // 순서를 바꾸는 함수 [큰수, 작은수]
    public int[] change(int[] list){
        
        if(list[1] > list[0]){
            int chg = list[1];
            list[1] = list[0];
            list[0] = chg;
        }
        return list;
    }       
}

⇒ 휴! 통과다! 그치만 뭔가 찜찜한 기분이 든다.. 너무 길어서..?

모범 답안

class Solution {
    public int solution(int[] wallet, int[] bill) {
        int answer = 0;
        while(max(wallet) < max(bill) || min(wallet) < min(bill)) {
            bill[bill[0] > bill[1] ? 0 : 1] /= 2;
            answer++;
        }
        return answer;
    }

    private int max(int[] arr) {
        return Math.max(arr[0], arr[1]);
    }

    private int min(int[] arr) {
        return Math.min(arr[0], arr[1]);
    }
}

Math.max와 Math.min을 사용해서 굉장히 간단하게 구현할 수 있다...

post-custom-banner

0개의 댓글