알고리즘 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
문제
[동전 교환(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
중요내용
- DFS() 함수의 인자 L은 거슬러 줄 동전의 개수를 의미한다.
- DFS() 함수의 인자 sum은 거슬러 줄 동전 금액의 총합을 의미한다.
- a.sort(reverse=True)는 해당 리스트의 값들을 내림차순으로 정렬하는 코드이다.
- 이렇게 내림차순으로 정렬하는 이유는 금액이 높은 동전을 먼저 탐색하여 빠르게 답을 찾기 위함이다. (거슬러 줄 동전 개수의 최소값을 찾기 위함)
- DFS() 함수 안에서 변수 res를 정의하기 때문에, 변수 res는 지역변수로 인식되며 이를 전역변수로 인식시키기 위해서는 global res라는 코드를 반드시 작성해야 한다.
- if 절의 L > res 조건은 시간 복잡도를 개선하기 위한 코드이다.
- 즉, sum == m 조건을 만족시켜 이미 거슬러 줄 동전의 최소값(res)를 구했는데 더 이상 sum == m 을 만족하는 새로운 res 값을 찾을 이유가 없기 때문에 L > res 조건을 통해 불필요한 코드 실행을 방지하는 것이다.
- 해당 문제의 풀이는 스택 자료구조와 재귀함수를 사용하여, 트리 구조를 탐색하는 방법으로 접근한 것이다.
'알고리즘' 카테고리의 다른 글
Algorithm - 수열 추측하기(순열, 파스칼 삼각형 활용) (0) | 2021.12.28 |
---|---|
Algorithm - 순열 구하기(DFS) (0) | 2021.12.21 |
Algorithm - 중복순열 구하기(DFS) (0) | 2021.12.19 |
Algorithm - 바둑이 승차(DFS) (0) | 2021.12.17 |
Algorithm - 합이 같은 부분집합(DFS) (0) | 2021.12.16 |
댓글