// education

08. 탐욕법(Greedy Algorithm) - 그리디 선택 속성, 회의실 배정 및 분할 배낭 문제

매 순간마다 눈앞에 보이는 가장 최선의 선택을 해 나가는 **탐욕 알고리즘(Greedy Algorithm)**과 정당성 증명 조건을 다룹니다.


4. 실전 파이썬(Python 3) 알고리즘 구현 코드 및 라인별 주석 해설

본 레슨의 핵심 연산 매커니즘을 파이썬 3 환경에서 가장 효율적이고 직관적으로 구현한 실전 소스 코드입니다. 모든 주요 라인마다 상세한 한글 주석이 기재되어 있어 코드의 흐름을 쉽고 명확하게 이해할 수 있습니다.

# 1. 회의실 배정 문제 (Greedy - 종료 시간 기준 오름차순 정렬)
def max_meetings(meetings: list) -> int:
    """종료 시간이 가장 빠른 회의부터 우선 선택하는 탐욕 알고리즘"""
    # 1. 종료 시간(x[1]) 기준 오름차순 정렬 (종료 시간 동일 시 시작 시간(x[0]) 오름차순)
    meetings.sort(key=lambda x: (x[1], x[0]))
    
    count = 0
    last_end_time = 0
    for start, end in meetings:
        # 직전 회의 종료 시간 이후에 시작하는 회의인 경우 채택
        if start >= last_end_time:
            count += 1
            last_end_time = end  # 종료 시간 갱신
    return count

# 2. 분할 배낭 문제 (Fractional Knapsack)
def fractional_knapsack(capacity: float, items: list) -> float:
    """무게 대비 가치가 가장 높은 물건부터 쪼개어 담는 탐욕 알고리즘"""
    # items = [(weight, value), ...]
    # 1. 단위 무게당 가치(value/weight) 기준 내림차순 정렬
    items.sort(key=lambda x: x[1] / x[0], reverse=True)
    
    total_value = 0.0
    for weight, value in items:
        if capacity >= weight:
            # 물건 전체를 통째로 담음
            capacity -= weight
            total_value += value
        else:
            # 배낭의 남아있는 용량만큼 물건을 쪼개서 담음
            total_value += value * (capacity / weight)
            break  # 배낭이 가득 차서 종료
    return total_value

if __name__ == "__main__":
    meetings = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 8), (5, 9), (6, 10), (8, 11), (8, 12), (2, 13), (12, 14)]
    print("최대 배정 가능한 회의 수:", max_meetings(meetings))

파이썬 소스 코드 핵심 포인트 해설

  1. meetings.sort(key=lambda x: (x[1], x[0])): 회의가 가장 일찍 끝나는 순서대로 정렬해야 뒤이어 더 많은 회의를 선택할 수 있다는 탐욕적 선택 속성을 적용합니다.

5. 알고리즘 설계 및 최적화 실무 지침 (Best Practices & Complexity Audit)

08. 탐욕법(Greedy Algorithm) - 그리디 선택 속성, 회의실 배정 및 분할 배낭 문제 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

1) 공간/시간 복잡도 한계 및 메모리 사용 제어

2) 예외 케이스(Edge Cases) 및 코딩 테스트 체크리스트

  1. 입력 경계값 검증: $N=1$ 이거나 $N=0$ 인 극단적 최소 입력, 혹은 모든 요소의 값이 동일한 경우(Corner Case)에 대한 예외 처리를 누락하지 않습니다.
  2. 무한 루프 및 사이클 감지: 그래프/트리 탐색 시 방문 처리 배열(visited[])의 업데이트 위치를 정확히 지정하여 중복 큐 삽입으로 인한 메모리 초과를 예방합니다.

6. 핵심 요약 및 실무 FAQ (Summary & Q&A)

Q1. 파이썬 코드 주석에서 강조된 성능 핵심은 무엇인가요?

Q2. 실무 개발에서 본 파이썬 알고리즘 패턴은 어디에 활용되나요?

← 이전07. 투 포인터(Two Pointers)와 슬라이딩 윈도우(Sliding Window) - 1차원 배열 $O(N)$ 연속 탐색 다음 →09. 동적 계획법(Dynamic Programming) 1: 기초 - Top-down(메모이제이션) vs Bottom-up(타뷸레이션)