본문 바로가기
알고리즘

Algorithm - 동전 교환(DFS)

by DGK 2021. 12. 21.

 

알고리즘 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

문제

[동전 교환(DFS)]

 

다음과 같이 여러 단위의 동전들이 주어져 있을 때, 거스름돈을 가장 적은 수의 동전으로 교환해주는 프로그램을 작성하시오. (단, 각 단위의 동전은 무한정 사용할 수 있음)

 

 

*입력 설명

첫 번째 줄에는 동전 종류의 개수 N(1 ≤ N ≤ 12)이 주어진다.

두 번째 줄에는 N개의 동전 종류가 주어진다.

세 번째 줄에는 거슬러 줄 금액 M(1 ≤ M ≤ 500)이 주어진다.

 

*출력 설명

첫 번째 줄에 거슬러 줄 동전의 최소개수를 출력한다.

 

 


 

 

풀이(Python)

답안

import sys
sys.stdin = open('AA/input_49.txt', 'rt')

def DFS(L, sum):
    global res
    if L > res:
        return
    if sum > m:
        return
    if sum == m:
        if L < res:
            res = L
    else:
        for i in range(n):
            DFS(L+1, sum+a[i])

if __name__=="__main__":
    n = int(input())
    a = list(map(int, input().split()))
    m = int(input())
    res = 2147000000
    a.sort(reverse=True)
    DFS(0, 0)
    print(res)
    
# 출력 : 5

 

input_49.txt(입력)

5
1 5 7 11 15
39

 

 

중요내용

  1. DFS() 함수의 인자 L은 거슬러 줄 동전의 개수를 의미한다.
  2. DFS() 함수의 인자 sum은 거슬러 줄 동전 금액의 총합을 의미한다.
  3. a.sort(reverse=True)는 해당 리스트의 값들을 내림차순으로 정렬하는 코드이다.
  4. 이렇게 내림차순으로 정렬하는 이유는 금액이 높은 동전을 먼저 탐색하여 빠르게 답을 찾기 위함이다. (거슬러 줄 동전 개수의 최소값을 찾기 위함)
  5. DFS() 함수 안에서 변수 res를 정의하기 때문에, 변수 res는 지역변수로 인식되며 이를 전역변수로 인식시키기 위해서는 global res라는 코드를 반드시 작성해야 한다.
  6. if 절의 L > res 조건은 시간 복잡도를 개선하기 위한 코드이다.
  7. 즉, sum == m 조건을 만족시켜 이미 거슬러 줄 동전의 최소값(res)를 구했는데 더 이상 sum == m 을 만족하는 새로운 res 값을 찾을 이유가 없기 때문에 L > res 조건을 통해 불필요한 코드 실행을 방지하는 것이다.
  8. 해당 문제의 풀이는 스택 자료구조와 재귀함수를 사용하여, 트리 구조를 탐색하는 방법으로 접근한 것이다.

 

 

댓글