[그리디] 코딩테스트 문제 TIL (동전 0) - 백준 11047번

말하는 감자·2024년 9월 9일
1
post-thumbnail

이번 문제는 주어진 동전들 중에서 최소의 개수 조합으로 K를 만드는 일종의 거스름돈 문제와 유사한 문제입니다.


1. 오늘의 학습 키워드

  • 그리디

2. 문제: 동전 0 (11047번)

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초256 MB156277841826420552.855%

문제

준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

예제 입력 1 복사

10 4200
1
5
10
50
100
500
1000
5000
10000
50000

예제 출력 1 복사

6

예제 입력 2 복사

10 4790
1
5
10
50
100
500
1000
5000
10000
50000

예제 출력 2 복사

12

출처

알고리즘 분류


3. 나의 풀이

문제 이해 및 접근

이 문제는 그리디 알고리즘을 사용하여 주어진 동전들로 가치의 합을 최소 개수로 만들어야 하는 문제입니다. 동전의 가치가 오름차순으로 주어지며, 각 동전의 가치는 그 이전 동전의 배수로 주어지기 때문에 큰 동전부터 사용하면 최적의 해를 구할 수 있습니다. 이 문제는 거스름돈 문제와 유사하며, 큰 금액의 동전부터 사용하여 최적의 해를 찾는 전형적인 그리디 알고리즘 문제입니다.

접근 방법

  1. 큰 동전부터 사용: 주어진 동전들 중에서 가장 큰 동전부터 사용하여 K를 나누어 최대한 많이 사용합니다.
  2. K를 줄여가며 동전 개수 계산: 나머지 금액에 대해 다시 그보다 작은 동전으로 나누어 동전 개수를 계산합니다.
  3. 동전의 가치를 하나씩 줄여가며 최종적으로 K원을 만드는 최소 동전 개수를 구합니다.

코드 설명

import sys

def solution(N, K, coin):
    cnt = 0  # 동전 개수 카운터

    # 동전 리스트를 뒤에서부터 (큰 값부터) 사용
    for i in range(N - 1, -1, -1):
        cnt += K // coin[i]  # 해당 동전으로 몇 개 사용할 수 있는지 계산
        K %= coin[i]  # K에서 해당 동전으로 나눈 나머지를 계산

    return cnt  # 필요한 동전 개수 반환

# 입력 처리
N, K = map(int, sys.stdin.readline().split())
coin = []
for i in range(N):
    coin.append(int(sys.stdin.readline().strip()))

# 결과 출력
print(solution(N, K, coin))

풀이 과정

  1. 큰 동전부터 계산: coin 리스트에서 가장 큰 동전부터 차례대로 K를 나누어 해당 동전을 몇 개 사용할 수 있는지 계산하고, 나머지 금액을 다음 작은 동전으로 처리합니다.
  2. 반복문: range(N-1, -1, -1)은 동전 리스트를 큰 값부터 순차적으로 처리하기 위한 반복문입니다. 동전 개수는 cnt에 누적됩니다.
  3. 나머지 처리: K %= coin[i]를 사용해 현재 동전으로 나누고 남은 금액을 처리합니다.
  4. 최종적으로 필요한 동전 개수를 반환합니다.

시간 복잡도

  • 이 알고리즘의 시간 복잡도는 동전의 종류에 따라 O(N)O(N)입니다. 동전의 개수 N에 비례하며, 주어진 동전의 리스트를 순회하면서 K를 처리합니다.
  • 이 문제에서는 그리디 알고리즘이 항상 최적해를 보장하므로, 효율적인 풀이입니다.

마무리

이번 문제는 그리디 알고리즘의 대표적인 유형인 동전 문제로, 큰 금액의 동전부터 사용하여 최소한의 동전 개수로 K원을 만드는 문제였습니다. 이 문제의 핵심은 동전 리스트를 정렬하는 대신, 이미 오름차순으로 주어졌기 때문에 리스트를 뒤에서부터 순회하며 큰 동전부터 처리함으로써 불필요한 연산을 줄일 수 있었다는 점입니다.

따라서 정렬 작업 없이 동전 리스트를 뒤에서부터 순회하는 방식으로 시간 복잡도를 O(N)으로 유지하면서 문제를 해결할 수 있었습니다. 이는 동전 거스름돈 문제와 유사한 문제로, 그리디 알고리즘이 최적의 해를 보장하는 좋은 예시였습니다.

이번 문제를 통해 그리디 알고리즘의 원리를 다시 한 번 복습할 수 있었으며, 코딩 테스트에서도 자주 출제되는 유형이니 꼭 연습해두면 좋을 것입니다!

읽어주셔서 감사합니다!!

하루하루 발전하는 개발자가 될거야!

profile
할 수 있다

0개의 댓글

관련 채용 정보