티스토리 뷰

728x90
반응형

목차

     

     

     

    문제

     

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

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

     

    입력

     

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

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

    ($1 ≤ A_i ≤ 1,000,000$, $A_1 = 1$, $i ≥ 2$인 경우에 $A_i$는 $A_{i-1}$의 배수)

     

    출력

     

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

     

    풀이

     

    그리디 알고리즘은 문제의 조건이 특별한 경우에만 유효한 방식이다.

     

    [Java]그리디 알고리즘(Greedy Algorithm)

     

    [Java]그리디 알고리즘(Greedy Algorithm)

    그리디 알고리즘은 탐욕 알고리즘, 욕심쟁이 알고리즘이라고도 불린다. 현재 상황에서 당장 눈앞에 보이는 최적의 결과를 선택해 나가는 방식이기 때문인데, 가장 간단한 예는 다음과 같다. 주

    gnidinger.tistory.com

    이 문제의 경우, 위 입력에 빨간 글자로 표시한 부분이 이 '특별한 경우'에 해당한다.

     

    해당 조건 덕분에 문제는 단순히 가치가 높은 동전부터 순서대로 많이 사용하는 경우가 정답이 된다.

     

    문제를 풀어가는 순서는 아래와 같다.

     

    1. n과 k를 입력받고, 동전의 개수를 저장할 변수 count를 0으로 선언한 뒤, n개의 동전을 순서대로 입력받는다.
    2. 가치가 큰 동전부터 사용하기 위해 배열의 가장 뒤 인덱스부터 시작해 거꾸로 순회하며 개수를 세어간다.
      1. k를 현재 동전의 가치로 나눈 몫을 count에 더해준다.
      2. k를 현재 동전의 가치로 나눈 나머지로 갱신해 준다.
      3. 가장 작은 가치의 동전까지 반복해 준다.

    알고리즘을 좀 더 최적화하기 위해선 가치가 작은 동전으로 옮기기 전에 k가 먼저 0에 도달하는 경우

     

    반복문을 탈출하도록 설정하면 된다.

     

    Java

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Prob11047 {
    
    	public static void main(String[] args) throws IOException {
    
    		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 count = 0;
    
    		int[] coins = new int[n];
    
    		for (int i = 0; i < n; i++) {
    			coins[i] = Integer.parseInt(br.readLine());
    		}
    
    		for (int i = n - 1; i >= 0; i--) {
    			if (k >= coins[i]) {
    				count += k / coins[i];
    				k %= coins[i];
    			}
    		}
    
    		System.out.println(count);
    	}
    }

     

    Python

     

    import sys
    
    n, k = map(int, sys.stdin.readline().rstrip().split())
    coins = [int(sys.stdin.readline().rstrip()) for _ in range(n)]
    cnt = 0
    
    for i in range(n - 1, -1, -1):
        if k >= coins[i]:
            cnt += k // coins[i]
            k %= coins[i]
    
    print(cnt)

     

    Performance

     

     

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/05   »
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    글 보관함