반응형
https://www.acmicpc.net/problem/14916
✅ 실버 Ⅴ
🔶 풀이
편의점 카운터에서 일한다.
2원과 5원만 이용해서 최소한의 동전으로 거스름돈을 주면 된다.
해당 문제에 알고리즘 분류는 dp, 그리드 알고리즘
두 가지 방법으로 다 풀어봤다.
1️⃣ dp
Bottom-Up 방법을 사용.
우리가 알 수 있는 작은 문제는 5원까지.
1원 = X
2원 = 1개
3원 = X
4원 = 2개
5원 = 1
6원부터 시작하면 시작하면 된다.
dp[6] = Math.min(dp[6-2], dp[6-5]) → Math.min(dp[4], dp[1]) → 2 와 Integer.MAX_VALUE 중 작은 거에서 동전 하나를 더 쓰므로 +1 해주면 3.
dp[7] = Math.min(dp[7-2], dp[7-5]) → Math.min(dp[5], dp[2]) → 1 과 1 중 작은 거에서 동전 하나를 더 쓰므로 +1 해주면 2.
·
·
·
dp[13] = Math.min(dp[13-2], dp[13-5]) → Math.min(dp[11], dp[8]) → 4 와 4 중 작은 거에서 동전 하나를 더 쓰므로 +1 해주면 5.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(br.readLine());
if (N < 5) {
System.out.println(N % 2 == 0 ? N/2 : -1);
return;
}
int[] dp = new int[N+1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[2] = 1;
dp[4] = 2;
dp[5] = 1;
for (int i=6; i<=N; i++) {
dp[i] = Math.min(dp[i-2], dp[i-5]) + 1;
}
System.out.println(dp[N]);
}
}
2️⃣ 그리드 알고리즘
N이 양수일 때 2원씩 감소시키면서 5원으로 딱 떨어질 때 바로 나누어주면 된다.
반복문이 종료되었을 때 N이 음수가 된다면 불가능한 수라고 판단.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(br.readLine());
int ans = 0;
while (N > 0) {
if (N % 5 == 0) {
ans = N / 5 + ans;
break;
}
N-=2;
ans++;
}
if (N < 0) {
System.out.println(-1);
} else {
System.out.println(ans);
}
}
}
반응형
'알고리즘 > 구현 & 그리디 & 브루트포스' 카테고리의 다른 글
[JAVA] 13904번: 과제 (0) | 2023.12.18 |
---|---|
[JAVA] 백준 15736번: 청기 백기 (0) | 2023.11.07 |
[JAVA] 백준 1107번: 리모컨 (0) | 2023.09.18 |
[JAVA] 백준 5107번: 마니또 (0) | 2023.07.31 |
[자바로 푸는 백준] 18430번 무기 공학 (0) | 2023.06.20 |