그리디 알고리즘에 대해 공부한 뒤, 그리디 알고리즘 관련 첫번째 문제인 11047번 : 동전 0 을 풀었다.
그리디 알고리즘 에 대해 아직 이해하지 못했다면 다음의 블로그에서 확인하면 된다.
https://lucy1215.tistory.com/12
[알고리즘] 그리디 알고리즘 (Greedy Algorithm)
💡그리디(탐욕) 알고리즘 (Greedy Algorithm)이란? - Greedy는 '탐욕스러운, 욕심많은' 이란 뜻이다. - 탐욕 알고리즘은 말 그대로 선택의 순간마다 당장 눈 앞에 보이는 최적의 상황만을 쫓아 최종적인
lucy1215.tistory.com
<문제>
<문제 해석>
그리디 알고리즘을 이용하여 k원을 만드는데 동전의 최소 갯수를 구하라.
<문제 해결>
이 문제는 그리디 알고리즘만 이해하고 있으면 쉽게 풀 수 있는 문제라고 생각한다.
예제 문제 1번으로 설명을 해보겠다.
동전의 최소 갯수를 구하려면,
금액보다 작은 수들 중, 가장 큰 수부터 나눠서 최대한 금액을 줄여야한다.
금액이 4200원 이라면
4200원보다 작은 수들 중 가장 큰 수인 1000원으로 먼저 나눠야한다.
4200 / 1000 = 4
그리고 다음 금액은 4200 % 1000 인 200원이 된다.
200원보다 작은 수들 중 가장 큰수인 100원으로 나누면
200 / 100 = 2 가 되고
다음 금액은 200 % 100 = 0 이므로 더 이상 진행하지 않아도 된다.
총 동전의 갯수는 4 + 2 = 6개가 된다.
<알고리즘>
1. 다음 금액이 0이 될 때까지 진행
2. 금액보다 작은 수들 중 가장 큰수로 금액을 나눈 값 => 동전의 갯수
3. 다음 금액 : 금액 % 동전의 금액
<코드>
import java.io.IOException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] ar = new int[n];
int count=0;
for(int i=0;i<n;i++) {
ar[i] = sc.nextInt();
}
for(int i=n-1;i>=0;i--) {
if(ar[i] <= k) {
count += k/ar[i];
k = k % ar[i];
}
}
System.out.println(count);
}
}
그리디 알고리즘을 공부하고 난 뒤 문제를 풀어보니 훨씬 빠르고 쉽게 풀 수 있었다.
어떤 문제든 알고리즘이나 자료구조를 먼저 공부하고 이해한 뒤 풀어야한다.
다음으로 계속해서 그리디 알고리즘에 대한 문제들을 풀어보겠다.
https://www.acmicpc.net/problem/11047
11047번: 동전 0
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
www.acmicpc.net
'백준' 카테고리의 다른 글
[백준] 10828번 : 스택 (JAVA) (0) | 2023.01.09 |
---|---|
[백준] 1931번 : 회의실 배정 (JAVA) (2) | 2023.01.06 |
[백준] 14889번 : 스타트와 링크 (JAVA) (0) | 2023.01.05 |
[백준] 14888번 : 연산자 끼워넣기 (JAVA) (0) | 2023.01.05 |
[백준] 2580번 : 스도쿠 (JAVA) (0) | 2023.01.03 |