본문 바로가기

Computer/Coding Test

코딩테스트 문제 (9) - 효율적인 화폐구성

반응형

문제

화폐의 단위가 배열 $a$로 주어지고 이 화폐들의 개수를 최소한으로 이용해서 그 가치의 합이 $m$원이 되도록 하려고 합니다. 각 화폐를 중복해서 사용할 수 있습니다. $m$원을 만들기 위한 최소한의 화폐개수를 구하는 문제입니다. $m$원을 만들 수 없을 때는 -1을 return합니다.

1. a = [2,3], m = 15
=> 5 
2. a = [3], m = 4
=> -1

풀이

1번 문제부터 생각해보겠습니다. 15를 만드는 경우의 수는 [2,2,2,3,3,3], [3,3,3,3,3],[2,2,2,2,2,2,3] 의 3가지가 있는데 이중 [3,3,3,3,3]이 개수가 제일 적어 답은 5가 됩니다. 

먼저, 화폐단위보다 작은 $m$은 조합을 만들 수 없기 때문에 -1을 return합니다. $m$을 만들기 위한 최소한의 화폐개수는 어떻게 될까요? 1번 문제의 [2,3]이 화폐 단위라면 $m-2$의 최소한의 화폐개수와 $m-3$의 최소한의 화폐개수 중 최소값에서 1을 더하면 됩니다. 따라서, 이 문제는 다이나믹 프로그래밍으로 해결할 수 있습니다. 최적 부분 구조중복된 하위문제의 조건을 만족하기 때문이죠.

다이나믹 프로그래밍으로 문제를 해결하기 위해서는 어떠한 방식으로든 각 $m$값에 대한 dp table을 작성해야 합니다. 그렇다면 dp table에 담기는 값은 해당 $m$을 얻기 위한 최소한의 화폐개수가 되겠죠.

화폐개수가 여러 개이므로 각 화폐단위마다 dp table을 완성하는 형태로 진행해 보도록 하겠습니다. 화폐단위를 여러 개 동시에 비교하는 것이 아니므로 예를 들어 '2' 화폐단위에 대해서 dp table을 완성할 때, $m$의 최소한의 화폐개수와 $m-2$의 최소한의 화폐개수 + 1 의 값 중 최소값을 담으면 될 것 같습니다. dp table의 $m-2$ 값에 1을 더하는 이유는 해당 화폐단위가 한 개 추가되어 $m$을 만들기 때문입니다. 그리고 그 다음 화폐단위에 대해서 dp table을 완성시키면 될 것 같습니다.

kaggle.com의 notebook으로 작성한 풀이는 다음과 같습니다.

홍머스 정리

  • 다이나믹 프로그래밍
  • 난이도: 상, 방법론 생각하기가 까다로움
  • 온사이트 코딩 인터뷰라면 이 정도까지는....?

참조

반응형