문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/340199
지갑 < 지폐
일 경우 해당 수를 반으로 나눈 뒤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을 사용해서 굉장히 간단하게 구현할 수 있다...