알고리즘/백준
[BaekJoon]백준 11047번_동전0 for JAVA
정석이
2021. 10. 5. 10:09
동전0
이 문제는 그리디 알고리즘 유형에 있는 문제이다.
https://ticssfm.tistory.com/32?category=1008893
[Algorithm] 탐욕(그리디) 알고리즘 (greedy algorithm)
그리디 알고리즘은 문제를 해결하는 과정에서 가장 좋다고 생각하는 방법을 선택하는 알고리즘이다. 예를 들어 노드 값의 최대 합은 5 -> 7 -> 9를 거쳐 21임을 알 수 있다. 그러나 그리디 알고리즘
ticssfm.tistory.com
필요한 동전의 개수라는 말만 봐도 그리디를 사용함을 알 수 있다.
그리디는 가장 최적의 값을 우선적으로 할당해주는 알고리즘이므로 본 문제를 풀 때 가장 큰 값을 먼저 대입해봐야한다.
Ai는 Ai-1의 배수라는 말은.. 어차피 입력은 여기서 해줄 것이기 때문에 신경쓰지 않을 것이다...(굳이 넣으려면 넣을순 있음)
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Baek11047 {
public static void main(String[] args) throws IOException{ // 동전0
//동전종류 N, 합 K 띄어쓰기로 입력받고 줄바꿔서 N개의 동전의 가치가 오름차순으로 주어짐 + N >= 2이면 배수로;;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken()); // 동전 종류 개수
int K = Integer.parseInt(st.nextToken()); // 합
int coin[] = new int[N];
for(int i = 0; i < N; i++) { // 동전의 종류 입력받음
coin[i] = Integer.parseInt(br.readLine());
}
int last = K;
int count = 0;
for(int i = N-1; i >=0; i--) {
//if(last % coin[i] != last) {
count += last / coin[i]; // 어차피 더 큰값이면 몫이 0이기때문에 그냥 더해주면 됨!
last = K - coin[i] * (K/coin[i]);
if(last == 0) break;
//} else {continue;}
}
System.out.println(count);
}
}
가장 큰 값부터 대입하기 위해 오름차순으로 대입된 배열을 거꾸로 count 해준다.
위에가 주석으로 지운 if문을 넣었을 때, 아래가 뺐을 때이다.
남의 코드를 살펴보니 확실히 배열을 사용하는 것보다 arraylist를 사용하는 것이 훨!!씬 효율적이었다.