[python] 11047_동전 0

yeco_ob·2023년 1월 30일
0

문제

준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다. 동전을 적절히 사용해서 그 가치의 합을 K로 만드려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.


입력

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


출력

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


의사 코드

  1. n, k값 입력 받기
  2. 동전 종류 입력 받은 후 내림차순 정렬
  3. k를 동전으로 나누고 몫만큼 cnt에 더하고 k에 나머지 대입
  4. 나머지가 0이면 반복문 탈출 후 출력

제출

n, k = map(int,input().split()) # n: 동전의 종류 수, k: 목표 금액
coins = [] #동전 종류 리스트 형태로 입력 받기
for _ in range(n):
    coins.append(int(input()))
coins.sort(reverse=True) #내림차순 정렬

cnt = 0 #총 동전의 개수 변수

for coin in coins:
    if k >= coin: #k가 동전의 값보다 크다면
        cnt += k // coin #나눈 몫만큼 cnt에 더하기
        k %= coin #k에 나머지 대입
        if k <= 0: #k가 0이면(나머지가 0이면)
            break #반복문 탈출

print(cnt)

코드 설명

그리드 알고리즘의 특징에 따라 큰 코인으로 먼저 나눠야 최소의 코인 개수를 구할 수 있습니다. 그래서 내림차순 정렬을 해줘야 합니다.

coins[ ]이라는 리스트를 선언해주고 반복문으로 n만큼 입력 받아 줍니다. 이때 오름차순 정렬 함수인 sort()를 이용해 내림차순 정렬을 해주기 위해 reverse="True"를 적용해 줍니다.

coins 리스트 안의 coin을 순서대로 k에 나눠주는 반복문 입니다. k가 coin보다 크다면 나눌 수 있으므로 나누고 몫을 cnt에 더해줍니다. 그 후 k는 나머지로 바꿔줍니다.

위 과정을 반복하다 나머지를 대입 받는 k가 0이 된다면 즉, 나머지가 0이라면 반복문을 탈출합니다.


메모

이렇게 풀면 이중 조건문인데 다른 방법이 없을까

0개의 댓글