로고잡식성 개발자
March 11, 2023
알고리즘 이론 | 그리디(Greedy) 파이썬으로 구현하기
algorithm | 파이썬으로 그리디를 구현하는 방법에 대해 알아봅니다.

그리디(Greedy) 알고리즘은 현재 상황에서 가장 좋은 선택을 하는 것을 반복하여 최적해를 구하는 알고리즘 기법입니다. 파이썬에서는 다음과 같이 그리디 알고리즘을 구현할 수 있습니다.

예제1: 동전 거스름돈 문제

n원의 동전을 거슬러 주어야 할 때, 거슬러 줄 동전의 개수가 최소가 되도록 하려면 어떻게 거슬러 줘야 할까요? 예를 들어, 1260원을 거슬러 주어야 할 때, 500원, 100원, 50원, 10원 동전이 각각 몇 개씩 필요한지 구하는 문제입니다.

def change(n):
    coins = [500, 100, 50, 10]  # 동전 종류
    count = 0  # 거슬러 준 동전 개수
    for coin in coins:
        count += n // coin  # 동전 개수 누적
        n %= coin  # 거슬러 줘야 할 돈 계산
    return count

# 1260원 거슬러 주기
print(change(1260))  # 출력 결과: 6

위 코드에서 change() 함수는 n원을 거슬러 줄 때, 최소한의 동전 개수를 계산하여 리턴합니다. 동전 종류를 리스트로 정의하고, 반복문을 통해 각 동전 종류마다 거슬러 줘야 할 동전 개수를 계산합니다. 거슬러 줘야 할 돈을 계산하기 위해 나머지 연산자(%)를 사용합니다. 마지막으로 거슬러 준 동전 개수를 리턴합니다.

예제2: 동전 거스름돈

동전의 종류와 거스름돈의 금액이 주어졌을 때, 거슬러줘야 할 동전의 최소 개수를 구하는 예제입니다.

def coin_change(coins, amount):
    coins.sort(reverse=True)  # 동전의 큰 단위부터 검사
    count = 0
    for coin in coins:
        while amount >= coin:
            amount -= coin
            count += 1
    if amount == 0:
        return count
    else:
        return -1

# 동전 거스름돈 문제 예제
coins = [500, 100, 50, 10]
amount = 1260
print(coin_change(coins, amount))

위 코드에서 coin_change() 함수는 주어진 동전의 종류와 거스름돈의 금액을 받아 거슬러줘야 할 동전의 최소 개수를 구합니다. 동전의 종류를 큰 단위부터 검사하면서 거슬러줘야 할 금액(amount)보다 작은 동전을 가능한 많이 거슬러주면 됩니다. 거슬러줘야 할 금액이 동전의 종류로 나누어 떨어지지 않는 경우, 거스름돈을 정확히 거슬러줄 수 없으므로 -1을 리턴합니다.

예제3: 회의실 배정

주어진 회의 일정 중 겹치지 않게 최대한 많은 회의를 할 수 있는 예제입니다.

def meeting_rooms(intervals):
    intervals.sort(key=lambda x: x[1])  # 종료시간 기준으로 정렬
    count = 0
    end_time = 0
    for interval in intervals:
        if interval[0] >= end_time:
            end_time = interval[1]
            count += 1
    return count

# 회의실 배정 문제 예제
intervals = [(0, 30), (5, 10), (15, 20)]
print(meeting_rooms(intervals))

위 코드에서 meeting_rooms() 함수는 주어진 회의 일정 중 겹치지 않게 최대한 많은 회의를 할 수 있는 개수를 구합니다. 회의 일정을 종료시간을 기준으로 정렬하면서, 현재 회의가 이전 회의의 종료시간보다 뒤에 시작하는 경우에만 회의를 할 수 있습니다. 이전 회의의 종료시간을 갱신하고, 회의를 할 수 있는 개수를 증가시킵니다.