* [한빛미디어] 이것이 코딩테스트다 with 파이썬 책 & 강의를 공부하고 정리하였습니다.
<목차>
1. 그리디 알고리즘이란?
2. [문제] 거스름돈 문제
그리디 알고리즘은 무엇일까?
그리디 알고리즘(탐욕법)은
현재 상황에서 지금 당장 좋은 것만 고르는 방법 을 의미한다.
일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구한다.
그리디 해법은 그 정당성 분석이 중요하다.
즉, 단순히 가장 좋아 보이는 것을 반복적으로 선택해도 최적의 해를 구할 수 있는지 검토한다.
예를들어,
다음과 같은 그래프가 있다.
[문제상황]
루트 노드부터 시작하여 거쳐 가는 노드 값의 합을 최대로 만들고 싶다.
Q.
이때 최적의 해는 무엇일까?

파란색으로 색칠한 것과 같이 5->7->9 를 선택하면 21(= 5+7+9) 이 되어 최대가 된다.
그런데 이때
Q.
단순히 매 상황에서 가장 큰 값만 고른다면 어떻게 될까?

주황색으로 색칠된 노드값과 같이 19(= 5+10+4)가 된다.
그리디 알고리즘은 이처럼
단순히 매 상황에서 가장 큰 값을 방식이라고 할 수 있다.
위의 예시처럼
일반적인 상황에서 그리디 알고리즘은 최적의 해를 보장할 수 없을 때가 많다.
하지만 코딩테스트에서의 대부분의 그리디 문제는 탐욕법으로 얻은 해가 최적의 해가 되는 상황에서,
이를 추론할 수 있어야 풀리도록 출제된다.
그리디 알고리즘과 정렬
그리디 알고리즘은 기준에 따라 좋은 것을 선택하는 알고리즘이므로,
문제에서 '가장 큰 순서대로 '가장 작은 순서대로' 와 같은 기준을 알게 모르게 제시해준다.
대체로 이 기준은 정렬 알고리즘을 사용했을 때 만족시킬 수 있으므로
그리디 알고리즘은 자주 정렬 알고리즘과 짝을 이뤄 출제된다.
<문제> 거스름 돈 : 문제 설명

<문제> 거스름 돈 : 문제 해결 아이디어
최적의 해를 빠르게 구하기 위해서는
가장 큰 화폐 단위부터 돈을 거슬러 주면 된다.
N원을 거슬러 줘야 할 때, 가장 먼저 500원으로 거슬러 줄 수 있을 만큼 거슬러 준다.
이후에 100원, 50원, 10원짜리 동전을 차례대로 거슬러 줄 수 있을 만큼 거슬러 주면 된다.
N=1,260일 때의 예시를 확인해보자.


<문제> 거스름 돈 : 정당성 분석
가장 큰 화폐 단위부터 돈을 거슬러 주는 것이
최적의 해를 보장하는 이유는 무엇일까?
A.
가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로
작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문이다.
만약에 800원을 거슬러 주어야 하는데 화폐 단위가 500원, 400원, 100원이라면 어떻게 될까?
그리디 알고리즘 문제에서는 이처럼 문제 풀이를 위한 최소한의 아이디어를 떠올리고
이것이 정당한지 검토할 수 있어야 한다.
<문제> 거스름 돈 : 답안 예시 (Python)
n=1260
count=0
#큰 단위의 화폐부터 차례대로 확인하기
array=[500,100,50,10]
for coin in array:
count+=n//coin #해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
print(count)
<문제> 거스름 돈 : 시간 복잡도 분석
- 화폐의 종류가 K라고 할 때, 소스코드의 시간 복잡도는 O(K)이다.
- 이 알고리즘의 시간 복잡도는 거슬러줘야하는 금액과 무관하며, 동전의 총 종류에만 영향을 받는다.
'CS > 알고리즘' 카테고리의 다른 글
| [그리디] 곱하기 혹은 더하기 (2) | 2024.12.09 |
|---|---|
| [그리디] 1이 될 때까지 (0) | 2024.12.09 |
| [그리디]구명보트 (1) | 2024.03.19 |