2원과 5원만 가지고 거스름돈을 최소한으로 주는 방법의 수를 구하는 문제이다.
13원 = 5원 1개, 2원 4개 = 5개
14원 = 5원 2개, 2원 2개 = 2개
23원 = 거스름돈을 딱 맞게 줄 수 없으므로 -1 리턴
거스름돈을 최소한으로 주기 위해서는 5원짜리로 최대한 많이 주어야만 한다.
그렇기 때문에, 5원을 최대한으로 주었을 때를 가장 먼저 계산해야 한다.
1. 거스름돈이 n이라 할때, 일단 n/5를 통해 가장 많이 줄 수 있는 5원의 개수를 구한다.
2. 1번에서 값이 딱 떨어진다면, 5원으로만 거스름돈을 줄 수 있기 때문에 해당 값이 최솟값일 것이다.
하지만, 여기에서 값이 떨어지지 않았다면 5원을 주고 남은 나머지 금액을 2원으로 줄 수 있는지 확인한다.
나머지가 모두 2원으로 떨어진다면, 이 경우가 최소한의 동전 개수를 구하는 방법일 것이다.
여기에서 준 5원의 개수는 n/5 즉, n을 5로 나누었을 때의 몫이다.
n - n/5 가 5원으로 주고 나온 나머지 금액이고, 이 금액의 몫이 바로 줄 수 있는 2원의 개수이다.
결국, n/5 + ( n-n/5)%2 의 값이 최소한의 동전일 것이다.
3. 하지만, 2번에서 딱 떨어지지 않을 수도 있다.
그럴 경우에는, 5원의 개수를 1개 감소시켜서 위의 방법을 반복하면서 가장 최소의 값을 찾아야 한다.
5원이 0일때까지 반복했는데도 딱 떨어지는 값이 없다면, 5원과 2원만으로는 거스름돈을 줄 수 없는 방법이므로 -1을 리턴하도록 한다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n = sc.nextInt();
int size = n/5;
int result = -1;
for(int i=size;i>=0;i--){
if((n-(5*i))%2==0){
result = i+(n-5*i)/2;
break;
}
}
System.out.println(result);
}
}
이 문제처럼 접근해서 풀어도 문제는 잘 풀릴 것 같으나, 위의 방식이 생각해내기가 쉬워 보인다..
백준 1463번 : 1로 만들기
무조건 나누는 것, 특히 3으로 나누는 게 우선이라고 생각한 것이 가장 큰 함정이었다. 생각했던 예시 중에서 생각할 만한 예시는 26이었다. 26 -> 25 -> 24 -> 8 -> 4 ->... -> 13 -> 12 -> 4 -> 로 26은 13 -..
dyii.tistory.com
'CS > 알고리즘' 카테고리의 다른 글
백준 1654번 : 랜선 자르기 (0) | 2021.03.02 |
---|---|
백준 11052번 : 카드 구매하기 (0) | 2021.02.25 |
백준 9095 번 : 1, 2, 3 더하기 (0) | 2021.02.23 |
백준 11727 번 : 2*n 타일링2 (0) | 2021.02.23 |
백준 11726번 : 2*n 타일링 (0) | 2021.02.18 |