공부하는 블로그

Baekjoon | Q.11047 - 동전 0 본문

알고리즘 공부

Baekjoon | Q.11047 - 동전 0

치킨닮은닭 2020. 6. 16. 20:58
 

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

 동전들의 가치와 총 가치 K가 주어진다. 이 때 총 가치 K에 딱 맞도록 하는 동전의 최소 개수를 찾는 문제이다. 쉽게 말해 거스름돈 문제라고 생각하면 된다.

import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int k = sc.nextInt();
    int[] coin = new int[n];
    for (int i = 0; i < n; i++) {
      coin[i] = sc.nextInt();
    }
    sc.close();
    
    int count = 0;
    for (int i = n-1; i >= 0; i--) {
      if(k == 0) break;
      if(k >= coin[i]) {
        count += k / coin[i];
        k = k % coin[i];
      }
    }

    System.out.println(count);
  }
}

 동전의 최소 개수를 찾으려면 가장 큰 가치의 동전을 이용하여 총 가치 K를 채워나가면 된다. 문제를 보면 동전 종류별 가치를 오름차순으로 입력된다는 조건이 있으므로 coin[i]에는 동전의 가치가 오름차순으로 정렬되어 있다. 따라서 가장 마지막 coin[n-1]부터 차례로 index를 감소시키면서 탐색하면 된다.

 

 k가 현재 동전의 가치(coin[i])보다 크거나 같다면 동전의 개수를 저장하는 변수인 count에 k를 coin[i]로 나눈 몫을 더해준다. 그리고 k는 나머지값으로 갱신해준다.

 

 위 과정을 k가 0이 될 때 까지 반복하면 동전의 최소 개수를 구할 수 있다.

Comments