문제 설명
민수는 다양한 지폐를 수집하는 취미를 가지고 있습니다. 지폐마다 크기가 달라 지갑에 넣으려면 여러 번 접어서 넣어야 합니다. 예를 들어 지갑의 크기가 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
'코딩테스트' 카테고리의 다른 글
프로그래머스) 추억 점수(level 1) - Java(자바) (0) | 2025.06.20 |
---|---|
프로그래머스) 자릿수 더하기(Level 1) - 자바(Java) (0) | 2025.05.29 |
프로그래머스) 약수의 합(level 1) - Java(자바) (0) | 2025.05.26 |