[ BOJ / Python ] 2293번 동전 1

황승환·2021년 11월 12일
0

Python

목록 보기
27/498

이번 문제는 다이나믹 프로그래밍으로 해결하는 문제였다. 반복되는 연산을 저장하여 연산 횟수를 줄이는 다이나믹 프로그래밍의 장점을 이용했다.

  • n, k 를 입력받는다.
  • 동전의 금액을 입력받는 coin 배열을 선언하고 입력받는다.
  • 동전의 합의 경우 수를 저장하는 answer 배열을 선언한다. 이때 answer 배열의 인덱스는 동전의 합을 의미한다. answer배열의 크기는 k+1이 된다.
    -> ex) answer[4]는 동전의 합이 4가 되는 경우의 수를 저장하는 원소이다.
  • answer[0]은 1로 저장한다. 이는 answer[가장 작은 동전 금액]을 구하기 위함이다.
  • 이중 for문을 통하여 값을 구한다.
    -> 바깥 for문은 i가 coin배열을 돌게 한다.
    -> 안쪽 for문은 j가 coin배열의 해당 원소부터 k까지 돌게 한다.
    -> 안쪽 for문에서 조건문을 통해 answer배열을 업데이트한다. 이때 조건은 j-i가 0보다 크거나 같은 경우이고, 조건문 안에서 answer[j]에 answer[j-i]를 더해준다.
  • answer[k]를 출력한다. 이는 k원이 되는 경우의 수가 된다.

Code

n, k = map(int, input().split())
coin = []
for i in range(n):
    coin.append(int(input()))
answer = [0]*(k+1)
answer[0] = 1
for i in coin:
    for j in range(i, k+1):
        if j-i>=0:
            answer[j] += answer[j-i]
print(answer[k])

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글