Programing/Algorithm

JavaScript로 해결하는 활동 선택 문제 (Activity Selection Algorithm)

2025. 6. 3. 18:48
반응형

활동 선택 문제란?

"활동 선택 문제"는 주어진 여러 활동 중에서 겹치지 않도록 가장 많은 활동을 선택하는 문제입니다. 각 활동은 "시작 시간"과 "종료 시간"으로 정의되며, 하나의 활동이 끝난 후에만 다음 활동을 시작할 수 있다는 조건이 있습니다.

이 문제는 "탐욕 알고리즘(Greedy Algorithm)"을 활용하여 빠르고 효율적으로 해결할 수 있는 대표적인 스케줄링 문제입니다.


문제 정의

  • 활동은 [start, end] 형태의 쌍으로 주어짐
  • 하나의 시간대에는 하나의 활동만 가능
  • 선택된 활동은 서로 겹치지 않아야 함
  • 목표: 선택할 수 있는 활동의 최대 개수를 구함

실생활 예시

  • 회의실 예약 시간표 구성
  • 작업 스케줄 최적화
  • 인터뷰 일정 조정

탐욕 알고리즘의 접근 방식

핵심 전략

"종료 시간이 빠른 순"으로 활동을 정렬한 후, 현재 선택된 마지막 활동의 종료 시간보다 늦게 시작하는 활동만을 차례대로 선택합니다.

왜 종료 시간을 기준으로 정렬할까?

종료 시간이 빠르면 다음 활동을 더 일찍 시작할 수 있어 전체적으로 더 많은 활동을 선택할 수 있기 때문입니다.


JavaScript 예제 코드

function activitySelection(activities) {
  // 종료 시간을 기준으로 오름차순 정렬
  activities.sort((a, b) => a[1] - b[1]);

  const selected = [];
  let lastEnd = 0;

  for (let [start, end] of activities) {
    if (start >= lastEnd) {
      selected.push([start, end]); // 현재 활동 선택
      lastEnd = end; // 종료 시간 갱신
    }
  }

  return selected;
}

// 예시 실행
const activities = [
  [1, 4],
  [3, 5],
  [0, 6],
  [5, 7],
  [3, 9],
  [5, 9],
  [6, 10],
  [8, 11],
  [8, 12],
  [2, 14],
  [12, 16]
];

const result = activitySelection(activities);
console.log("선택된 활동:", result);

코드 흐름 설명

  1. 활동 리스트를 "종료 시간" 기준으로 정렬합니다.
  2. lastEnd를 초기화하고, 활동을 하나씩 확인하면서 이전 활동의 종료 시간 이후에 시작하는 경우만 선택합니다.
  3. 선택된 활동들을 배열에 저장하여 반환합니다.

출력 결과

선택된 활동: [ [ 1, 4 ], [ 5, 7 ], [ 8, 11 ], [ 12, 16 ] ]

총 4개의 활동이 선택됩니다.


시간 복잡도 분석

  • 정렬: O(n log n)
  • 선택 과정: O(n)
  • 총 시간 복잡도: O(n log n)

활용 사례

  • 컨퍼런스 룸 최적 배정
  • 강의실 스케줄 자동 배정 시스템
  • 면접 일정 자동 조정

주의할 점

  • 이 알고리즘은 항상 최적의 해를 보장합니다.
  • 단, 활동이 동시에 종료되거나 시작 시간이 동일한 경우 처리 방식에 유의해야 합니다.

마무리 및 학습 자료

"활동 선택 문제"는 그리디 알고리즘이 효과적으로 적용되는 전형적인 예제입니다. 핵심은 각 단계에서 가장 최적인 선택이 전체적으로도 최적인 결과로 이어진다는 점을 이해하는 것입니다.

추천 학습 자료:

  • GeeksforGeeks: Activity Selection Problem
  • LeetCode: Interval Scheduling
반응형

'Programing > Algorithm' 카테고리의 다른 글

JavaScript로 이해하는 프림 알고리즘 (Prim’s Minimum Spanning Tree)  (1) 2025.06.05
JavaScript로 이해하는 크루스칼 알고리즘 (Minimum Spanning Tree)  (0) 2025.06.05
JavaScript로 이해하는 병합 정렬 (Merge Sort Algorithm)  (1) 2025.06.04
JavaScript로 이해하는 회의실 배정 문제 (Meeting Room Scheduling)  (0) 2025.06.04
JavaScript로 해결하는 거스름돈 문제 (Greedy Algorithm)  (1) 2025.06.03
JavaScript로 해결하는 0/1 배낭 문제 (Knapsack Problem)  (1) 2025.06.03
JavaScript로 해결하는 동전 교환 문제 (Coin Change Algorithm)  (2) 2025.06.03
JavaScript로 이해하는 최적 경로 탐색 (최소 비용 경로, 다익스트라 알고리즘)  (1) 2025.06.03
'Programing/Algorithm' 카테고리의 다른 글
  • JavaScript로 이해하는 병합 정렬 (Merge Sort Algorithm)
  • JavaScript로 이해하는 회의실 배정 문제 (Meeting Room Scheduling)
  • JavaScript로 해결하는 거스름돈 문제 (Greedy Algorithm)
  • JavaScript로 해결하는 0/1 배낭 문제 (Knapsack Problem)
Dongkkase
Dongkkase
개발자로 일하면서 부딪히는 문제풀이가 누군가에게 도움이 되길 바라며
    반응형
  • Dongkkase
    정집사의 개발로그
    Dongkkase
  • 전체
    오늘
    어제
    • All (478)
      • 금융 (61)
      • Programing (295)
        • Algorithm (39)
        • API (2)
        • javascript (122)
        • CSS (8)
        • HTML (10)
        • PHP (15)
        • JAVA (27)
        • JSP (17)
        • JSP 예제 (1)
        • IOS (1)
        • Android (1)
        • Sencha Touche (1)
        • bat file, cmd (0)
        • 디버깅 (2)
        • SQL (21)
        • MS-SQL (1)
        • MySQL (13)
        • 보안 (5)
      • Server (14)
        • Docker (1)
        • Windows (9)
        • Linux (3)
        • jeus (1)
      • Database (6)
      • IT 일반 (15)
      • 리뷰 (38)
        • Book (17)
        • 제품 (2)
        • 영화 소개 (11)
        • 음악 소개 (7)
      • 잡생각 (36)
        • 회고 (3)
        • 컬럼 (4)
        • 자료실 (6)
        • 낙서장 (12)
        • 위시리스트 (2)
        • WOW (1)
        • 덕 (1)
  • 인기 글

  • 최근 댓글

  • 태그

    읽고 싶은 책
    자바
    It
    IT·컴퓨터
    jsp
    JavaScript
    기초
    SQL
    js패턴
    디자인패턴
    IT 관련
    자바스크립트
    Java
    위시리스트
    IT블로그
    사고 싶은 책
    iT's MY LiFE
    php
    블로그
    자바스크립트유틸
Dongkkase
JavaScript로 해결하는 활동 선택 문제 (Activity Selection Algorithm)
상단으로

티스토리툴바