CodingTest/그리디 알고리즘

그리디 알고리즘 이론

seongduck 2022. 7. 4. 21:51

그리디 알고리즘(탐욕법)

  • 현재 상황에서 지금 당장 좋은 것만 고르는 방법
  • 일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구
  • 최적의 해를 구하기

예제)

출처 : 이코테2021

 

이경우 최적의 해보단 낮은 값이 나오게 된다.

 

그리디 알고리즘은 이처럼 매 상황에서 최고의 상황만 선택한다.

  • 일반적인 상황에서 최적의 해를 보장할 수 없다.
  • 코딩테스트의 경우 이처럼 그리디 알고리즘으로 푸는 것이 최적의 해가 나오도록 설계되어 있다.
  • 정당성 분석을 진행한다.

문제1 : 거스름 돈

출처 : 이코테 2021

문제1 : 1. 문제 해결 아이디어

  1. 최적의 해를 빠르게 구하기 위해서는 가장 큰 화폐 단위부터 돈을 거슬러 준다.
  2. N원을 거슬러 줘야 할 때, 가장 먼거 500원으로 거슬러 줄 수 있을 만큼 거슬러 준다.
  3. 이후에 100원, 50원, 10원짜리 동전을 차례대로 거슬러 준다.

 

문제1 : 2. 정당성 분석

  1. 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없다.
  2. 화폐 단위가 500원, 400원 단위일 경우 400원의 배수는 500이 될 수 없기 때문에 그리디를 사용할 수 없다.
  3. 하지만 항상 전단위 화폐가 앞 단위 화폐의 배수이므로 가능하다.

 

문제 1 : 3. 풀이

n = 1260
count = 0

#큰 단위의 화폐부터 차례대로 확인하기
array = [500,100,50,10]

for coin in array:
    count += n // coin #해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
    n %= coin
    
print(count)
  1. 현재 금액에서 남아 있는 동전으로 최대한 나눠준다.
  2. count에는 계속 남은 n //coin (몫)이 계속 쌓인다.
  3. n은 남은 금액의 나머지가 쌓인다.
#실행 결과
6

 

문제 1 : 4. 시간 복잡도 분석

  • 화폐의 종류가 K라고 할 때, 소스코드의 시간 복잡도는 O(K)이다.
  • 이 알고리즘의 시간 복잡도는 거슬러줘야 하는 금액과는 무관하고, 화폐의 종류에만 영향을 받는다.

'CodingTest > 그리디 알고리즘' 카테고리의 다른 글

모험가 길드  (0) 2022.07.05
곱하기 혹은 더하기  (0) 2022.07.05
1이 될 때까지 반복적으로 수행  (0) 2022.07.05