도구스학업·수학

가중 구간 스케줄링 계산기

구간마다 가중치(수익)가 붙은 스케줄링 문제를 동적계획법(DP)으로 풉니다. 개수가 아니라 가중치 합을 최대로 하며, 끝 기준·가중치 기준 탐욕이 왜 최적이 아닌지 반례로 나란히 보여 줍니다.

구간 (한 줄에 «이름 시작 끝 가중치»)

«개발 11:00 15:00 120» 처럼 적습니다. 이름은 없어도 되고, 시각 대신 «2 6 120» 같은 숫자를 써도 됩니다. 가중치는 수익·중요도 같은 값어치입니다. #으로 시작하는 줄은 건너뜁니다.

DP로 구한 최대 가중치 합

100

전체 4개 중 1개 선택

DP(최적)100
끝 기준 탐욕(가중치 무시)2
가중치 큰 것부터 탐욕100
J1
1
0~2
J4
100
0~4
J2
1
1~3
J3
1
2~4
개수가 아니라 가중치 합을 최대로 할 때는 탐욕이 아니라 동적계획법(DP)이 필요합니다. 구간을 끝나는 시각 순으로 정렬해 j번째까지 봤을 때의 최선을 OPT(j)라 하면, OPT(j) = max(OPT(j−1), 가중치(j) + OPT(p(j)))입니다. p(j)는 j와 겹치지 않는 구간 중 번호가 가장 큰 것이고, 이분 탐색으로 찾습니다. 앞서 구한 부분 문제의 답을 그대로 재사용하므로(최적 부분구조) 전체를 O(n log n)에 풀 수 있습니다.
j구간가중치p(j)OPT(j−1)w(j)+OPT(p(j))OPT(j)
1J1(0~2)10011
2J2(1~3)10111
3J4(0~4)10001100100 (담음)
4J3(2~4)111002100
끝 기준 탐욕(가중치 무시)은 반례가 있습니다. 가중치가 없을 때는(edu/activity-selection) 끝이 이른 것부터 고르면 항상 최적이지만, 가중치가 섞이면 그 증명이 깨집니다. 여러 개를 모아 봤자 값어치가 큰 구간 하나에 못 미칠 수 있기 때문입니다.
가중치가 큰 것부터 고르는 탐욕도 반례가 있습니다. 값어치가 크다는 이유로 넓은 구간을 먼저 담으면, 그 안에 들어가는 작은 구간 여럿의 합이 더 컸을 기회를 통째로 잃습니다. 0/1 배낭에서 비율 탐욕이 최적이 아닌 것과 같은 이유입니다 — 어느 하나를 먼저 고르는 규칙은 뒤에 어떤 조합이 기다리는지 모르고 결정하기 때문입니다.
앞 구간의 끝과 뒤 구간의 시작이 같으면 겹치지 않는 것으로 봅니다. p(j)를 찾을 때도 «끝 ≤ 시작(j)»을 기준으로 합니다.

계산 방법

  1. 1구간을 한 줄에 하나씩 «이름 시작 끝 가중치»로 적습니다. 9:00 11:00 30처럼 시각으로 써도, 1 3 30처럼 숫자로 써도 됩니다.
  2. 2DP가 고른 최대 가중치 합과 선택된 구간을 확인합니다.
  3. 3끝 기준·가중치 기준 탐욕과 값을 비교해 얼마나 손해 보는지 봅니다.
  4. 4DP 표에서 각 구간이 p(j)·OPT(j−1)·담았을 때 값을 어떻게 비교해 담김·버림이 정해지는지 봅니다.

자주 묻는 질문

개수가 아니라 가중치(수익) 합을 최대로 한다는 점이 다릅니다. 활동 선택 문제(edu/activity-selection)는 모든 구간의 가치가 같다고 보고 끝나는 시각이 이른 것부터 고르는 탐욕이 항상 최적이지만, 구간마다 가중치가 다르면 그 탐욕은 더 이상 최적이 아니어서 동적계획법이 필요합니다.

구간을 끝나는 시각 순으로 정렬해 1..n 번을 매기고, p(j)를 «j와 겹치지 않는(끝이 j의 시작보다 이르거나 같은) 구간 중 번호가 가장 큰 것»으로 둡니다. OPT(j) = max(OPT(j−1), 가중치(j) + OPT(p(j)))로, j를 버렸을 때와 담았을 때 중 큰 쪽을 택합니다. p(j)는 정렬된 끝 시각 배열에서 이분 탐색으로 찾아 전체를 O(n log n)에 풉니다.

가중치가 섞이면 최적이 아닙니다. 짧은 구간 여럿을 모아도 값어치가 큰 구간 하나에 못 미칠 수 있기 때문입니다. 예를 들어 [0,2]/1 [1,3]/1 [2,4]/1을 이어 붙이면 2를 고를 수 있지만, 이 셋을 모두 덮는 [0,4]/100 하나를 고르면 100입니다.

이것도 최적이 아닙니다. 값어치가 크다고 넓은 구간을 먼저 담으면 그 안에 들어가는 작은 구간 여럿의 합이 더 컸을 기회를 잃습니다. [0,10]/10 하나를 먼저 담으면 그 안의 [0,3]/6 [3,6]/6 [6,10]/6을 모두 잃어 10에 머물지만, 이 셋을 담으면 18입니다. 0/1 배낭에서 비율 탐욕이 최적이 아닌 것과 같은 이유입니다.

j번째 구간을 담을지 버릴지는 «j 하나의 값어치 + 그 앞에서 가능한 최선»과 «j를 무시한 j−1까지의 최선» 중 큰 쪽으로 결정되고, 이 부분 문제들의 최적해를 그대로 이어 붙이면 전체 최적해가 됩니다(최적 부분구조). 작은 사례에서는 2ⁿ 개의 모든 부분집합을 완전탐색해 같은 값이 나오는지로 검증할 수 있습니다.

겹치지 않은 것으로 봅니다. 10시에 끝나는 작업과 10시에 시작하는 작업은 이어서 할 수 있습니다. p(j)를 찾을 때도 «끝 ≤ 시작(j)»을 기준으로 합니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 구간은 30개까지 넣을 수 있습니다.
  • 가중치는 정수·소수 모두 받고, 음수는 부호가 구분자(하이픈)에 먹혀 사라지므로 사실상 0 이상만 다룹니다. 수익·중요도처럼 음수가 필요 없는 값을 염두에 둔 것입니다.
  • 시각은 24시를 넘겨 적어도 됩니다(예: 26:00은 다음 날 새벽 2시). 여러 날에 걸친 일정은 분 단위 숫자로 바꿔 넣어야 합니다.
  • 최적값이 같은 조합이 여럿일 수 있습니다. 이 계산기는 DP 되짚기에서 값이 같으면 뒤 구간을 버리는 쪽을 고른 조합 하나를 보여 줍니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 3일 · 결과는 참고용 추정치입니다.