🔗 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 개요
지갑의 크기와 지폐의 크기가 주어진다.
지폐를 지갑에 넣기 위해서는 지폐를 여러 번 접을 수 있다.
지폐를 접을 때는 항상 더 긴 쪽을 반으로 접으며, 길이가 홀수인 경우 소수점 이하는 버린다.
지폐는 그대로 넣거나 90도 회전해서 넣을 수 있다.
이때 지폐를 지갑에 넣기 위해 필요한 최소 접기 횟수를 구하는 문제이다.
📌 접근 방법
지폐는 90도 회전할 수 있으므로 wallet[0], wallet[1]을 그대로 bill[0], bill[1]과 비교하면 안 된다.
대신 지갑과 지폐 각각의 큰 값과 작은 값을 기준으로 비교한다.
지폐의 큰 값이 지갑의 큰 값보다 크거나, 지폐의 작은 값이 지갑의 작은 값보다 크면 아직 지갑에 들어갈 수 없다.
이 경우 지폐의 두 길이 중 더 긴 쪽을 반으로 접고, 접은 횟수를 1 증가시킨다.
이 과정을 지폐가 지갑에 들어갈 수 있을 때까지 반복한다.
📌 핵심 아이디어
지폐를 회전할 수 있기 때문에 다음과 같이 비교한다.
Math.max(bill[0], bill[1]) <= Math.max(wallet[0], wallet[1])
Math.min(bill[0], bill[1]) <= Math.min(wallet[0], wallet[1])
위 조건을 만족하면 지폐를 지갑에 넣을 수 있다.
반대로 하나라도 만족하지 못하면 접어야 한다.
while (
Math.max(bill[0], bill[1]) > Math.max(wallet[0], wallet[1]) ||
Math.min(bill[0], bill[1]) > Math.min(wallet[0], wallet[1])
) {
...
}
접을 때는 항상 긴 쪽을 반으로 접는다.
if (bill[0] > bill[1]) {
bill[0] /= 2;
} else {
bill[1] /= 2;
}
📌 전체 코드
class Solution {
public int solution(int[] wallet, int[] bill) {
int answer = 0;
while (
Math.max(bill[0], bill[1]) > Math.max(wallet[0], wallet[1]) ||
Math.min(bill[0], bill[1]) > Math.min(wallet[0], wallet[1])
) {
if (bill[0] > bill[1]) {
bill[0] /= 2;
} else {
bill[1] /= 2;
}
answer++;
}
return answer;
}
}
📄 정리
이 문제는 지폐를 직접 회전시키는 것이 아니라,
큰 값과 작은 값을 기준으로 비교하면 쉽게 해결할 수 있다.
지폐는 접을 때마다 크기가 바뀌므로 반복문 조건에서 Math.max, Math.min을 매번 다시 계산해야 한다.
단순 구현 문제지만, 반복 중 갱신되는 값을 조건식에 제대로 반영하는 것이 중요했다.
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 프로그래머스 폰켓몬 JAVA 풀이 (HashSet, 자료구조) (0) | 2026.06.15 |
|---|---|
| 프로그래머스 기사단원의 무기 JAVA 풀이 (약수, 구현) (0) | 2026.06.15 |
| 프로그래머스 자릿수 더하기 JAVA 풀이 (수학, 구현) (0) | 2026.06.12 |
| 프로그래머스 PCCP 기출문제 - 저수지 물 사용량 예측(Java) (0) | 2026.06.11 |
| 프로그래머스 옹알이 JAVA 풀이(문자열, 구현) (0) | 2026.06.10 |