본문 바로가기
Problem Solving/BOJ

[백준] 11047번 - 동전 0

by 테리는당근을좋아해 2020. 1. 10.

문제 >

준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.

동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.

 

입력 >

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)

둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

 

출력 >

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

 

해결방법 > 

대표적인 그리디 알고리즘으로 해결해야하는 문제로, 

액수가 큰 동전부터 사용하여 최소의 동전 수를 만들어준다.

 

[C++]

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool comp(int a, int b){
    return a > b;
}

int main(){
    int n, k;
    int cnt = 0;
    vector <int> v;

    cin >> n >> k;

    for(int i = 0; i < n; i++){
        int tmp;
        cin >> tmp;
        v.push_back(tmp);
    }

    sort(v.begin(), v.end(), comp);

    for(int i = 0; i < n; i++){
        if(k < v[i])
            continue;
        cnt += k / v[i];
        k = k % v[i];
    }
    cout << cnt;
}

 

[JAVA]

package baekjoon;

import java.util.*;

public class BOJ_11047 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int k = sc.nextInt();
		int[] a = new int[n];
		int cnt = 0;
		
		for(int i = a.length - 1; i >= 0; i--) {
			a[i] = sc.nextInt();
		}
		
		for(int i = 0; i < a.length; i++) {
			cnt += k / a[i];
			k = k % a[i];
		}
		
		System.out.println(cnt);
	}
}

 

문제링크 >

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

 

'Problem Solving > BOJ' 카테고리의 다른 글

[백준] 1541번 - 잃어버린 괄호  (0) 2020.01.10
[백준] 11399번 - ATM  (0) 2020.01.10
[백준] 3053번 - 택시 기하학  (0) 2020.01.10
[백준] 4153번 - 직삼각형  (0) 2020.01.10
[백준] 3009번 - 네 번째 점  (0) 2020.01.10

댓글