도구스학업·수학

집합 커버(그리디 vs 최적) 계산기

덮어야 할 원소와 고를 수 있는 부분집합을 넣으면 그리디 해와 전수 탐색으로 얻은 최적 해를 나란히 냅니다. 그리디가 몇 배 손해인지, 이론적 상한 1+ln n 안에 드는지 함께 보여 줍니다.

한 줄에 하나씩. «이름: 원소 원소»처럼 이름을 붙여도 되고 원소만 적어도 됩니다

비워 두면 위 부분집합들의 합집합을 전체집합으로 봅니다

그리디가 최적보다 많이 골랐습니다

그리디 3개 · 최적 2개

원소 6개를 부분집합 3개 가운데서 덮었습니다 · 근사비 1.5배

그리디 — 아직 안 덮인 것을 가장 많이 덮는 것부터

차례고른 것새로 덮은 원소남은 개수
1A1 2 3 4 (4개)2
2B5 (1개)1
3C6 (1개)0
그리디가 고른 것A, B, C
최적 (전수 탐색)B, C
근사비 (그리디 ÷ 최적)1.5배
이론적 상한 H(가장 큰 부분집합)2.083
1 + ln n (n = 6)2.792
살펴본 조합6가지 (전체 2^3 = 8가지)

부분집합 목록

이름원소크기고름
A1 2 3 44그리디
B1 2 53그리디 · 최적
C3 4 63그리디 · 최적
여기서 그리디가 진 까닭은 «가장 큰 것»을 먼저 집었기 때문입니다. A 집으면 그 순간 가장 많이 덮지만, 남은 것을 메우려면 결국 여러 개가 더 듭니다. 반면 B, C만 고르면 겹침 없이 딱 나뉩니다. 한 걸음 앞만 보는 판단이 전체로는 손해가 되는 전형적인 모습입니다.
그리디는 최적이 아닐 수 있지만 H(k) ≤ 1 + ln n 배를 넘지 않습니다. 매 단계에서 남은 원소의 최소 1/OPT만큼을 덮기 때문입니다(n은 원소 수, k는 가장 큰 부분집합의 크기, H는 조화수). 그리고 이 한계는 더 좁힐 수 없습니다 — P ≠ NP를 가정하면 (1−ε)·ln n보다 나은 근사는 불가능하다는 것이 증명되어 있습니다. 허술해 보이는 그리디가 사실상 이 문제의 최선인 셈입니다.
최적은 부분집합 20개까지만 구합니다. 고르는 방법이 2^m가지라 20개면 약 105만 가지, 40개면 1조 가지가 됩니다. 집합 커버는 NP-난해로 알려져 있어 다항시간에 최적을 내는 방법은 (P = NP가 아닌 한) 없습니다. 20개를 넘으면 그리디 해만 냅니다. 부분집합은 40개까지 받습니다.
같은 개수를 덮는 것이 여럿이면 앞에 적힌 것을 고릅니다. 동점을 무작위로 깨면 새로고침할 때마다 답이 바뀌어 계산기 노릇을 못 합니다. 그래서 순서를 바꿔 넣어 보면 그리디의 답이 달라질 수 있고, 그것 자체가 그리디의 성질입니다 — 최적 해는 순서와 무관합니다.

계산 방법

  1. 1고를 수 있는 부분집합을 한 줄에 하나씩 적습니다. «A: 1 2 3»처럼 이름을 붙여도 됩니다.
  2. 2덮어야 할 원소를 따로 정하고 싶으면 아래 칸에 적습니다. 비워 두면 합집합을 씁니다.
  3. 3그리디가 어떤 차례로 골랐는지, 최적은 무엇이었는지 표에서 비교합니다.
  4. 4근사비가 이론적 상한 1+ln n 안에 드는지 확인합니다.

자주 묻는 질문

덮어야 할 원소 전부를 가장 적은 개수의 부분집합으로 덮는 문제입니다. 예를 들어 모든 과목을 맡을 선생님을 최소 인원으로 뽑거나, 모든 지역에 닿도록 기지국을 최소 개수만 세우는 일이 그대로 이 문제입니다. NP-난해로 알려져 있어 다항시간에 최적을 내는 방법은 P = NP가 아닌 한 없습니다.

있습니다. 이 계산기의 기본 예가 그것입니다. U = {1,…,6}에 A = {1,2,3,4}, B = {1,2,5}, C = {3,4,6}이 있으면 그리디는 가장 큰 A를 먼저 집고 남은 5와 6 때문에 B와 C를 더 골라 3개가 듭니다. 그런데 A를 버리고 B·C만 고르면 2개로 끝납니다. 한 걸음 앞만 보는 판단이 나중의 선택지를 망친 것입니다.

최적의 H(k) ≤ 1 + ln n 배를 넘지 않습니다. n은 원소 수, k는 가장 큰 부분집합의 크기, H는 조화수입니다. 매 단계에서 남은 원소의 최소 1/OPT만큼을 덮기 때문에 이 보장이 성립합니다. 원소가 100개라면 최악이라도 최적의 5.6배 안입니다.

사실상 없습니다. P ≠ NP를 가정하면 (1−ε)·ln n보다 나은 근사비를 다항시간에 보장하는 알고리즘은 존재할 수 없다는 것이 증명되어 있습니다. 허술해 보이는 그리디가 이 문제에서는 이론적 한계에 닿아 있는 셈입니다.

부분집합 20개까지 전수 탐색으로 구합니다. 고르는 방법이 2^m가지라 20개면 약 105만 가지지만 40개면 1조 가지가 되어 브라우저에서 끝나지 않습니다. 20개를 넘으면 그리디 해만 내고 최적은 «접었다»고 표시합니다.

앞에 적힌 것을 고릅니다. 동점을 무작위로 깨면 새로고침할 때마다 답이 달라져 계산기 노릇을 못 하기 때문입니다. 그래서 줄 순서를 바꿔 넣으면 그리디의 답이 달라질 수 있는데, 그것 자체가 그리디의 성질입니다. 최적 해는 순서와 무관합니다.

전체를 덮을 수 없다고 알려 주고 그 원소를 짚어 줍니다. 그럴 때는 그리디도 최적도 «완전한 덮개»를 낼 수 없으므로, 덮을 수 있는 데까지 고른 결과만 보여 줍니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 최적 해는 부분집합 20개까지만 구합니다. 그 위로는 2^m이 너무 커져 그리디 해만 냅니다.
  • 원소는 30개, 부분집합은 40개까지 받습니다. 비트마스크를 32비트 정수 하나로 다루기 때문입니다.
  • 부분집합의 무게(비용)는 다루지 않습니다. 개수만 최소로 하는 문제입니다.
  • 동점은 앞에 적힌 것을 고릅니다. 줄 순서에 따라 그리디의 답이 달라질 수 있습니다.
  • 전체집합 밖의 원소가 부분집합에 들어 있으면 셈에서 뺍니다.

함께 보면 좋은 도구

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