[BOJ-11047] 동전 0 파이썬 풀이

ParkJunHa·2023년 5월 5일

BOJ

목록 보기
63/85
post-thumbnail

[Silver IV] 동전 0 - 11047

문제 링크

성능 요약

메모리: 114328 KB, 시간: 296 ms

분류

그리디 알고리즘

문제 설명

준규가 가지고 있는 동전은 총 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. 맨 처음 아이디어로는 lst를 돌면서 만약 해당 인덱스에 있는 값이 목표 값보다 작다면 빼주는 방식으로 돌렸다
  2. 두번째 (회고 란에 있는 코드)는 한번에 계산할 수 있는 만큼 돌렸다.

1번 코드로 했을떄는 python에서 시간초과가 발생했지만, 2번코드는 파이썬으로도 충분히 돌아간다.

코드

import sys
input = sys.stdin.readline
n, k = map(int, input().split())
lst = [int(input()) for _ in range(n)]
lst.sort(reverse=True)

i = 0
cnt = 0
while k:
    if k - lst[i] >= 0:
        k -=lst[i]
        cnt += 1
    else:
        i += 1
print(cnt)

회고

python으로 제출했을때 시간초과가 발생한다. 저렇게 리스트에 넣어서 빼는 방식으로 해서 그렇다. 그냥 연산을 해서 풀면 python으로 제출해도 문제가 없을것이다.
아래는 수학적인 연산을 이용한 새 코드이다.

import sys
input = sys.stdin.readline
n, k = map(int, input().split())
lst = [int(input()) for _ in range(n)]
lst.sort(reverse=True)

i = 0
cnt = 0
for op in lst:
    if k == 0:
        break
    if k >= op:
        m = k // op
        k -= (m*op)
        cnt += m
print(cnt)

한 번 루프마다 계산할 수 있는 만큼 모두 계산을 해주어 최적화 해주었다.
이렇게 계산해줌으로서 반복문을 도는 수를 획기적으로 줄였고 python으로도 AL이 나왔다.

profile
PS린이

0개의 댓글