Ⅰ. 서론
주어진 교환 대상 거스름돈 총액 C를 N개의 서로 다른 양의 정수 값을 갖는 동전(coin, C) \(c_{i} j=1,2, \cdots, n\)으로교환하는 경우 교환되는 거스름 돈(동전)의 개수 (number, n)rn의 합이 최소가 되는 rn를 찾는 문제를 거스름돈 만들기 문제(change-making problem, CMP)라 한다.[1]
Peaon[2]은 CMP가 다항시간 알고리즘이 알려져 있지 않은 NP-난제(NP-hard)로, 의 다항시간 알고리즘을 제안하기도 하였다.
CMP에 대해서는 욕심쟁이 알고리즘(greedy algorithm, GA)[3, 4], 분할정복(divide-and-conquer, DC)[5]과 동적 계획법(dynamic programming, DP)[1, 6-9]가 있다. GA 는 \(C-\text { max } c_{j}\)의 재귀뺄셈법을 반복수행하는 단순한 측면이 있지만 최적 해를 찾지 못하는 경우도 발생한다. DC 는 근 노드를 c로 자식 노드를 뺄셈 가능한 cj개로 하는 가능한 경우의 레벨을 재귀적으로 모두 형성하는 트리 뺄셈법(tree subtraction method)으로 c가 증가하면 수행 시간은 지수적으로 증가하는 경향이 있어 적용에 어려움이 있다. DP는 n행, c열의 행렬에 대해 재귀 적으로 나눗셈의 몫을 계산하는 방법으로 수행 복잡도는 로 준다항시간으로 알려져 있다. 그러나 c가 2n 보다 큰 경우 지수시간 복잡도를 갖는다. 따라서 지금까지 알려진 CMP의 최적 해를 찾는 알고리즘으로는 다항시간으로 해를 구하는 방법이 없는 실정이다.
본 논문은 CMP에 대해 최악(worst case)의 경우 \(O\left(\frac{n(n+1)}{2}\right)\) 복잡도, 최적(best case)의 경우 \(O\left(\frac{n(n+1)}{2}\right)\)복잡도를 갖는 나눗셈 알고리즘을 제안한다. 2장에서는 CPM 의 해를 얻는 GA, DC와 DP 문제점을 고찰해 본다. 3장 \(O\left(\frac{n(n+1)}{2}\right)\)에서는 수행 복잡도로 CMP의 정확한(최적) 해를 얻는 나눗셈 알고리즘(division algorithm, DA)을제안한다. 4장에서는 다양한 유형의 벤치마킹 실험 데이터를 대상으로 제안된 알고리즘의 적합성을 검증한다.
Ⅱ. 관련연구와 문제점
주어진 교환 대상 거스름돈의 총액인 c를 n개의 서로 다른 양의 정수 값(distinct positive integer values)을갖는 동전(coin, c) \(c_{j, j} j=1,2, \cdots, n\)이 오름차순인 \(c_{1}<c_{2}<\cdots, c_{n}\)으로 주어졌을 때 CMP는 교환되는 거스름돈(동전)의 무게(weight, wj)는 고려하지 않으며 단지 개수 xj의 합이 최소가 되는 를 찾는 문제로 식 (1)과 같이 수학적 모형으로 정의될 수 있다.[1] 결국 CMP는 동전의 무게는 고려하지 않고 단지 개수의 최소화를 추구하는 문제라 할 수 있다.
\(z={ }_{\text {minimize }} \sum_{j=1}^{n} x_{j}\) (1)
\(\text { subject to } \sum_{j=1}^{n} c_{j} x_{j}=C \text {. }\)
CMP를 풀 수 있는 알고리즘으로 지금까지 알려진 방법은 욕심쟁이 알고리즘(GA)[3, 4, 10], 분할정복(DC)[5, 11]와 동적 계획법(DP)[1, 6-9]이 있다.
GA는 \(C-\text { max } c_{j}\)를 반복 수행하는 재귀 뺄셈법 (recursive subtraction method, RSM)으로 계속해서 감산을 수행하여 수행횟수가 클 수 있는 단점과 더불어 원, 달러 등 일반적인 표준 동전 체계(canonical coin system)인 cj={1c, 5c, 10c, 25c, 50c, 100c} 또는 {10 원, 50원, 100원, 500원} 등과 같은 통화(currency)[13]에는 최적 해를 얻을 수 있지만 다른 단위로 주어지면 최적해를 찾지 못하는 단점도 갖고 있다.
DC는 근 노드를 c로 자식 노드를 뺄셈 가능한 cj개로하는 가능한 경우의 레벨을 재귀적으로 모두 형성하는 트리 뺄셈법(tree subtraction method)[14]으로 c가 증가하면 수행시간은 지수적으로 증가하는 경향이 있어 적용에 어려움이 있다. StaksOverflow[5]에 따르면 c- 50, 55, 60, 65, 70에 대해 cj={1, 5, 10, 12, 25, 50}인 경우 컴퓨터 수행시간(초)은 1, 5, 20, 126, 613초로 지수적으로 증가하여 실제적으로 활용이 불가함을 보였다.
DP는 n행, c열의 행렬에 대해 재귀적으로 나눗셈의 몫을 계산하는 방법으로 수행 복잡도는 o(nC)로 준다 항시 간으로 알려져 있다. 그러나 c가 2n보다 큰 경우 지수 시간 복잡도를 갖는다.
은행이나 시내버스, 자판기 등 거스름돈을 지불하는 수많은 분야에서는 동전 개수 최소화 또는 무게 최소화 목적을 달성하기 위해 CMP를 지속적으로 활용함에도 불구하고, 지금까지 알려진 CMP의 해를 찾는 알고리즘으로는 다항시간으로 해를 구하는 방법이 없는 실정으로 실무에 적용이 불가한 실정이다.
따라서 3장에서는 단순 계산기(또는 핸드폰)만 소지하고 있더라도 CMP의 최적 해를 빠르고 정확하게 찾을 수 있는 알고리즘을 제안한다.
Ⅲ. 다항시간 정확한 알고리즘
본 장에서는 나눗셈법을 적용한 알고리즘을 제안한다. 주어진 문제에서 \(c_{j}>C\) 이면 해당 cj 동전을 교환할 수없으므로 교환 대상 동전 후보에서 삭제한다. 개수(또는 무게) 최소화 목표를 달성하기 위해 나머지 후보들을 cj 내림차순 정렬한다. 또한 \(c_{k}=a c_{i}(a=2,3, \ldots)\)으로 ck가 ci 의 배수(역으로 ci는 ck의 약수)가 된다면 당연히 ck 개수가 ci 개수보다 적다는 속성을 적용하여 \(c_{j, j} j=1,2, \cdots, n\)에서 약수(divisor)를 제외시킨 k개를 행 i에 배정한다. 열에는 \(c_{j, j} j=1,2, \cdots, n\)를 배정한다. 이와 같이 k×n 행렬의 각 행 i에 대해 \(c_{i}=c_{j}\)부터 나머지 \(r_{j-1}-C\)에 대해 \(r_{j-1} \geq c_{j}\)인 경우 \(q_{i i}=\text { quotient }\left(r_{j-1}, c_{j}\right)\)로 나눗셈의 몫(quotient)을 계산하고 나머지(modulo) \(r_{j+1}=\bmod \left(r_{j}, c_{j}\right)\)는 다음 j열로 이동시키는 과정을 n열까지 반복 수행한다. 제안된 나눗셈 알고리즘(division algorithm, DA)의 기본 개념은 그림 1과 같다.
그림 1. 나눗셈 알고리즘 개념
Fig. 1. Concept of division algorithm
제안된 알고리즘은 \(c_{j, j} j=1,2, \cdots, n\)의 n개 동전 액면가 (coin denomination)에서 약수가 전혀 없는 개가 교환 대상 후보인 최악의 경우라 할지라도 k×n=n×n 행렬의 i=j인 주 대각선(main diagonal) n개와 i<j인 상 삼각행렬(upper triangle matrix)의 \(\frac{n(n-1)}{2}\)에 대해서만 나눗셈을 수행하므로 알고리즘 수행 복잡도는 \(O\left(\frac{n(n+1)}{2}\right)\)이다. 제안된 나눗셈 알고리즘(DA)은 그림 2와 같이 수행된다.
그림 2. 나눗셈 알고리즘
Fig. 2. Division algorithm
제안된 알고리즘은 일반적인 표준 동전 체계인 cj= {1c, 5c, 10c, 25c, 50c, 100c} 또는 {10원, 50원, 100 원, 500원} 등과 같은 통화인 경우 약수를 제외하면 100c, 500원 등 유일한 k-1이 존재하여 알고리즘 수행복잡도는 \(O(k n)=O(n)\)의 선형시간 복잡도로 최적 해를 얻을 수 있는 장점이 있다.
다음의 CMP1 예제 문제에 대해 DA를 수행한 결과는 그림 3과 같다.
CMP1:Cj-{1,5,10,20}, c=36
그림 3. CMP1에 관한 DA
Fig. 3. DA for CMP1
그림 3에서는 Cj={20, 15, 10, 1}에서 약수를 제외하면 {20}만 존재하여 Cj={20}이 되어야 하지만 이러한 약수 제거의 타당성을 검증하기 위해 (a)에서는 약수 미 제거인 경우, (b)에서는 약수 제거인 경우를 모두 제시하였다. Cj={20, 15, 10 , 1}으로 약수를 모두 제거한 maxCj=20에서 최적 해를 얻을 수 있음을 알 수 있다.
Ⅳ. 적용 및 결과 분석
본 장에서는 표 1의 38개 벤치마킹 실험 데이터를 대상으로 제안된 DA를 적용해 본다.
CMP2 ~ CMP7은 다음과 같이 시내버스 탑승 승객 중에서 교통카드를 지참하지 않아 고액권인 10, 000원 또는 5, 000원의 현금을 지불하는 경우이다.
CMP8 ~ CMP10은 직원에게 월급을 지불하지 않다가 노동청에 고발당해 동전으로 지급한 갑질 사례이다. CMP11 부터는 원문의 출처를 문제에 인용하였다. 표 1 의 실험 데이터에 대해 DA를 수행한 결과는 그림 4와 같다.
그림 4. 실험 데이터에 관한 DA
Fig. 4. DA for experimental data
제안된 DA는 최악의 경우라 할지라도 \(O\left(\frac{n(n+1)}{2}\right)\) 복잡도의 단순한 나눗셈의 몫과 나머지 계산으로 CMP 의 최적 해를 찾을 수 있음을 알 수 있어 단순 계산기를 활용하여도 쉽게 해를 구해 실무에 쉽게 적용 가능한 단순함과 정확성의 장점을 모두 갖고 있다고 할 수 있다.
Ⅴ. 결론
본 논문은 c를 \(c_{j}, j=1,2, \cdots, n\)의 동전으로 교환하는 경우 각 동전의 개수 xj에 대해 동전 개수를 최소화시키는 \(z=\min \sum_{j=1}^{n} x_{i}, \sum_{j=1}^{n} c_{i} x_{i}=C\)의 거스름돈 만들기 문제에 대해 최악의 경우 \(O\left(\frac{n(n+1)}{2}\right)\)수행 복잡도의 다항시간 알고리즘을 제안하였다. 제안된 알고리즘은 cj≤ c에 대해 j에 \(c_{j}, j=1,2, \cdots, n\)로 내림차순 배치하고, 행에는 ‘1’을 포함한 약수를 모두 제외시킨 k개만을 배치한 k×n 행렬에 대해 ci≤ cj의 셀에 \(q_{i j}=q u a t i e n t\left(r_{j-1}, c_{j}\right)\)인 몫만을, 나머지는 j+1열의 나눗셈에 활용하는 나눗셈 알고리즘을 제안하였다.
제안된 알고리즘은 매우 간단함에도 불구하고 39개 벤치마킹 실험 데이터에 적용한 결과 최적 해를 빠르고 정확하게 구할 수 있음을 보였다.
References
- J. W. Wright, "The Change-Making Problem," Journal of the Association for Computing Machinery, Vol. 22, No. 1, pp. 125-128, Jan. 1975, https:// doi.org/10.1145/321864.321874
- D. Pearson, "A Polynomial-time Algorithm for the Change-Making Problem," Operations Research Letters, Vol. 33, No. 3, pp. 231-234, May 2005, https://doi.org/10.1016/j.orl.2004.06.001
- P. E. Black, "Greedy Algorithm," Dictionary of Algorithms and Data Structures, U.S. National Institute of Standards and Technology, Feb. 2005.
- D. Kozen and S. Zaks, "Optimal Bounds for the Change-Making Problem," Theoretical Computer Science, Vol. 123, No. 2, pp. 377-388, Jan. 1994, https://doi.org/10.1007/3-540-56939-1_69
- StackOverflow, "Divide and conquer recursive solution for making change," https://stackoverflow.com/questions/56063638/divide-and-conquer-recursive-solution-for-making-change, Retrieved Feb. 2022.
- T. M. Chen and Q. He, "More on Change- Making and Related Problems," Journal of Computer and System Sciences, Vol. 124, pp. 159-169, Mar. 2021, https://doi.org/10.1016/j.jcss.2021.09.005
- M. R. Salavatipour, "Tutorial Notes for the Change Making Problem," http://webdocs.cs.ualberta.ca/~mreza/courses/CSC364/tut-notes/tut2, Retrieved Feb. 2022.
- J. A. Aslam, "CS7800 Advanced Algorithms: Dynamic Programming Solution to the Coin Changing Problem," Khoury College of Computer and Information Science, Northeastern University, Retrieved Feb. 2022.
- Q. Vu, "The Famous Coin Change Problem and its Possible New Applications," Undergraduate Journal of Mathematical Modeling: One+Two, Vol. 11, No. 1, Article 5, pp. 1-9, Jan. 2020, https://doi.org/10.5038/2326-3652.11.1.4924
- M. Fienup, "Greedy Coin-Change Algorithm," http://www.cs.uni.edu/~fienup/cs270s04/lectures/lec6_1-29-04_coin_change_web.htm, Retrieved Feb. 2022.
- Pweave, "Divide and Conquer Recursive Solution for Making Change," https://stackoverflow.com/questions/56063638/divide-and-conquer-recursive-solution-for-making-change, Retrieved Feb. 2022.
- X. Cai, "Canonical Coin Systems for Change- Making Problems," 9th International Conference on Hybrid Intelligent Systems, pp. 499-504, Aug. 2009, https://doi.org/10.1109/HIS.2009.103
- T. M. Chen and Q. He, "On the Change- Making Problem," Symposium on Simplicity in Algorithms, pp. 38-42, Feb. 2020, https://doi.org/10. 1137/1.9781611976014.7 https://doi.org/10.1137/1.9781611976014.7
- Wikipedia, "Greedy Algorithm," https://en.wikipedia.org/wiki/Greedy_algorithm, Retrieved Feb. 2022.
- A. Kumar and M. S. Visal, "Coin Change Making Problem Using Greedy Algorithm," https://www.yutube.com/watch?v=ZiQAqMR8jco, Retrieved Feb. 2022.
- M. Fienup, "Topics in Computing: Bioinformatics, Lecture 6(1-27-05) Slides, Divide-and-Conquer," http://www.cs.uni.edu/~fienup/cs188s05/lectures/lec6_1-27-05.htm, Retrieved Feb. 2022.
- P. Patel, "Change-Making Problem: Dynamic Method," https://medium.com/@pp7954296/changemaking-problem-dynamic-method-4954a446a511, Retrieved Feb. 2022.
- A. Mehmood, "ASH CC Algo.: Coin Change Algorithm Optimization," International Journal of Computer Applications, Vol. 178, No. 15, pp. 1-9, May 2019. https://doi.org/10.5120/ijca2019918787
- Terahertz, "The Coin-Change Problem," http://terahertzatheist.ca/2013/12/04/the-coin-change-problem/, Retrieved Feb. 2022.
- ProProfs, "What do You Know About the Change Making Problem?," https://www.proprofs.com/quizschool/story.php?title=3dq-what-do-you-know-about-the-change-making-problem, Retrieved Feb. 2022.
- M. C. Patterson and B. Harmel, "The Coin Changing Problem as a Mathematical Model," Journal of Applied Quantitative Methods, Vol. 5, No. 2, pp. 298-301, Sep. 2010.
- Z. Chan, "Coin Change Problem(Variation of Change Making Problem)," Oct. 2014, http://www.udaychettiar.com/wp/2014/10/coin-change-problem-variation-of-change-making-problem/
- J. Shallit, "What This Country Needs is an 18¢ Piece," Mathematical Intelligencer, Vol. 25, No. 2, pp. 20-23, Feb. 2003. https://doi.org/10.1007/BF02984830
- D. Anguin, "Making Change: Memorization and Dynamic Programming," http://zoo.cs.yale.edu/classes/topics/topic-making-change, Retrieved Feb. 2022.
- Y. Suzuki and R. Miyashino, "Characterization of Canonical Systems with Six Types of Coins for the Change-Making Problem," arXiv:2111.12392, pp. 1-18, Nov. 2021.
- A. Adamaszek and M. Adamaszek, "Combinatorics of the change-making problem," European Journal of Combinatorics, Vol. 31, No. 1, pp. 47-63, Jan. 2010, https://doi.org/10.1016/j.ejc.2009.05.002
- S. Goebbels, F. Gurski, J. Rethmann, and E. Yilmaz, "Change-Making Problems Revisited: A Parameterized Point of View," Journal of Combinatorial Optimization, Vol. 34, pp. 1218-1236, May 2017, https://doi.org/10.1007/s10878-017-0143-z
- A. Kaswan, "Greedy Algorithm to Find Minimum Number of Coins," https://www.baeldung.com/cs/min-number-of-coins-algorithm, Retrieved Feb. 2022.