알고리즘/백준

[백준] 11047번 : 동전 0 - 자바(JAVA)

Junuuu 2022. 2. 28. 00:01
반응형

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

 

문제 해석

준규는 동전을 많이 가지고 있는데 동전의 종류는 총 N이다.
동전을 적절히 사용하여 그 가치의 합을 K로 만드려고 한다. 이때 필요한 동전의 개수의 최솟값을 구하라.

 

입력

첫째 줄에  N과 K가 주어진다.

둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다.

 

제약조건

1 ≤ N ≤ 10

1 ≤ K ≤ 100,000,000

1 ≤ Ai ≤ 1,000,000, A1 = 1

i ≥ 2인 경우에 Ai는 Ai-1의 배수

 

출력

첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

 

문제 풀이 전 설계

동전의 가치가 배수로 주어지기 때문에 가치가 큰 동전을 사용해야지 동전 개수를 최소로 구할 수 있다.

 

만약 50000원을 예시로 들었을 때

50000원짜리 동전이 1개 필요하다면

10000원짜리 동전은 5개 필요하다.

5000원짜리 동전은 10개 필요하다.

최악의 경우 1원짜리 동전은 50000개 필요하다.

 

따라서 가치가 큰 동전부터 탐색을 하며 K원을 만들어야 한다.

 

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class CoinZero {

	static int kindOfCoin;
	static int sumOfValues;
	static int coinCount;
	static int[] coinArray;

	public static void main(String[] args) throws IOException {

		inputCoinInfo();
		getCoinCount();
		printCoinCount();

	}

	private static void inputCoinInfo() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		kindOfCoin = Integer.parseInt(st.nextToken());
		sumOfValues = Integer.parseInt(st.nextToken());
		coinCount = 0;
		coinArray = new int[kindOfCoin];

		for (int i = 0; i < kindOfCoin; i++) {
			coinArray[i] = Integer.parseInt(br.readLine());
		}
	}

	private static void getCoinCount() {

		while (sumOfValues != 0) {

			for (int i = kindOfCoin - 1; i >= 0; i--) {

				if (sumOfValues < coinArray[i]) {
					continue;
				}

				sumOfValues -= coinArray[i];
				coinCount++;
				kindOfCoin = i + 1;
				break;
			}
		}
	}

	private static void printCoinCount() throws IOException {

		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		bw.write(coinCount + "\n");
		bw.flush();
		bw.close();

	}

}

최적화를 위해서 kindOfCoin = i + 1; 구문을 추가하였습니다.

 

이를 통해 한번 1000원이 쓰이게 되면 이는 1000원을 초과하는 동전을 더 이상 사용할 수 없음을 의미하기 때문에 1000원 이하만 탐색합니다.