본문 바로가기
CS/알고리즘

[그리디] 그리디 알고리즘이란 & 거스름 돈 문제

by erase-jeong 2024. 12. 9.

 

* [한빛미디어] 이것이 코딩테스트다 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