그리디 알고리즘(탐욕법)은 현재 상황에서 지그 당장 좋은 것만 고르는 방법을 의미
일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구함
그리디 해법은 그 정당성 분석이 중요하다!
최적의 해
일반적인 상황에서 그리디 알고리즘은 최적의 해를 보장할 수 없을 때가 많다
하지만 코딩 테스트에서의 대부분의 그리디 문제는 탐욕법으로 얻은 해가 최적의 해가 되는 상황에서, 이를 추론할 수 있어야 풀리도록 출제된다.
문제
당신은 음식저의 계산을 도와주는 점원이다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러 주어야 할 돈이 N원일 때 거슬러 주어야 할 동전의 최소 개수를 구하여라. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수여야 한다.
문제 해결 아이디어
최적의 해를 빠르게 구하기 위해서는 가장 큰 화폐 단위부터 돈을 거슬러 주면된다.
N원을 거슬러줘야 할 때, 가장 먼저 500원으로 거슬러 줄 수 있을 만큼 거슬러 준다
N = 1260일 때의 예시를 확인해보자.
정당성 분석
가장 큰 화폐 단위부터 돈을 거슬러 주는 것이 최적의 해를 보장하는 이유는 무엇일까?
만약에 800원을 거슬러 주어야 하는데 화폐단위가 500원, 400원, 100원이라면 어떻게 될까?
그리디 알고리즘 문제에서는 이처럼 문제 풀이를 위한 최소한의 아이디어를 떠올리고 이것이 정당한지 검토할 수 있어야 한다.
거스름돈 답안 예시
n = 1260
count = 0
# 큰 단위의 화폐부터 차례로 확인
array = [500, 100, 50, 10]
for coin in array:
count += n // coin # 해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
n %= coin
print(count)
6
시간복잡도 분석
이제 이 거스름돈 풀이 방법을 분석해보면, 화폐의 종류가 K라고 할 때, 소스코드의 시간복잡도는 O(K)이다.
이 알고리즘의 시간 복잡도는 거슬러줘야하는 금액과는 무관하며, 동전의 총 종류에만 영향을 받는다
N에서 1을 뺀다
N을 K로 나눈다
예를 들어 N이 17, K가 4라고 가정해보자. 이때, 1번의 과정을 한 번 수행하면 N은 16이 된다. 이후에 2번의 과정을 수행하면 N은 1이 된다. 결과적으로 이 경우 전체 과정을 실행한 횟수는 3이되고, 이는 N을 1로 만드는 최소 횟수이다.
N과 K가 주어질 때 N이 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 최소 횟수를 구하는 프로그램을 작성해보아라
문제 해결 아이디어
주어진 N에 대하여 최대한 많이 나누기를 수행하면 된다.
N의 값을 줄일 때 2 이상의 수로 나누는 작업이 1을 빼는 작업보다 수를 훨씬 많이 줄일 수 있다(직관적으로?)
예를 들어 N = 25, K = 3 일때는 아래와 같다.
정당성 분석
가능하면 최대한 많이 나누는 작업이 최적의 해를 항상 보장할 수 있을까?
N이 아무리 큰 수여도, K로 계속 나눈다면 기하급수적으로 빠르게 줄일 수 있다.
다시 말해, K가 2 이상이기만 하면, K로 나누는 것이 1을 빼는 것보다 항상 빠르게 N을 줄일 수 있다.
또한, N은 항상 1에 도달하게 된다
최적의 해가 성립이 된다.
답안 에시
n, k = map(int, input().split())
result = 0
while True:
# N이 K로 나누어 떨어지는 수가 될 때까지 빼기
target = (n // k) * k ## 10 , 3이었을때 target은 9가됨 ## 스킬 : 나누어 떨어지는 수가 n 과 가까운 값을 찾고자 할때
result += (n-target) ## result 는 1이됨
n = target ## n = 9
# N 이 K보다 작을 때 (더 이상 나눌 수 없을때 반복문 탈출)
if n < k: ## 아니라면
break
result += 1 ## result는 2
n //= k ## n = 3
# 마지막으로 남은 수에 대하여 1씩 빼기
result += (n-1) ## result = 2
print(result)
25 3
6
서적 : 이것이 코딩 테스트다 with 파이썬
채널 : '동빈나' YouTube Channel