도구스개발

정확한 덮개(알고리즘 X) 계산기

0/1 행렬에서 모든 열을 정확히 한 번씩 덮는 행 집합을 크누스의 알고리즘 X로 모두 찾습니다. 남은 1이 가장 적은 열을 고르는 전략이 탐색 노드를 몇 배나 줄이는지 나란히 세어 보여 줍니다.

한 줄이 한 행입니다. 첫 줄에 열 이름을 적어도 됩니다. 열 32개·행 200개까지

정확한 덮개

1가지

열 7개를 겹치지도 빠뜨리지도 않고 덮는 방법입니다.

탐색 노드 수

남은 1이 가장 적은 열부터 (MRV)5
그냥 첫 열부터6
MRV가 줄여 준 배수1.2배
7개
6개

찾은 해

#행 수고른 행
13R2, R4, R6
집합덮개와는 전혀 다른 문제입니다. 집합덮개는 최소 개수로 덮기만 하면 되고 겹쳐도 상관없지만, 정확한 덮개는 개수를 묻지 않는 대신 «겹치지도 빠뜨리지도 않는가»를 묻습니다. {1,2}{2,3}{1,2,3}의 집합덮개지만 2가 두 번 덮이므로 정확한 덮개는 아닙니다.
어느 열을 고르느냐가 전부입니다. 남은 1이 가장 적은 열을 고르면 1이 하나뿐인 열은 바로 확정되고 0개인 열은 그 가지를 즉시 죽입니다. 무작위 행렬 300개로 재어 보면 이 전략이 한 번도 지지 않고 많게는 열 배 넘게 노드를 줄입니다.
댄싱 링크스는 다른 알고리즘이 아닙니다. DLX는 «지운 것을 되돌리기가 공짜인» 이중연결 리스트 구현 기법일 뿐이고 알고리즘 자체는 그대로 알고리즘 X입니다. 노드를 리스트에서 뺄 때 자기 자리의 포인터를 남겨 두면 되돌릴 때 그것으로 다시 끼워 넣을 수 있다는 것이 요점입니다.
스도쿠·N퀸·펜토미노가 모두 이 한 문제로 번역됩니다. 스도쿠는 «칸이 채워짐»·«행에 숫자»·«열에 숫자»·«상자에 숫자» 네 종류의 열을 두면 되고, 도미노 타일링은 칸 하나가 열 하나입니다. N퀸의 대각선처럼 «두 번 덮이면 안 되지만 안 덮여도 되는» 조건은 선택적 열이 되는데, 이 계산기는 필수 열만 다룹니다.

사용 방법

  1. 10/1 행렬을 한 줄에 한 행씩 넣습니다. 첫 줄에 열 이름을 적어도 됩니다.
  2. 2도미노 타일링 예제를 고르면 판 크기에서 행렬이 자동으로 만들어집니다.
  3. 3모든 정확한 덮개가 행 번호로 나옵니다.
  4. 4MRV로 열을 고를 때와 첫 열을 고를 때의 탐색 노드 수를 견줍니다.
  5. 5어떤 행으로도 덮을 수 없는 열이 있으면 따로 알려 드립니다 — 그러면 해가 있을 수 없습니다.

자주 묻는 질문

«겹쳐도 되는가»가 다릅니다. 집합덮개는 최소 개수로 덮기만 하면 되고 겹쳐도 상관없지만, 정확한 덮개는 개수를 묻지 않는 대신 모든 원소가 «정확히 한 번» 덮여야 합니다. {1,2}와 {2,3}은 {1,2,3}의 집합덮개지만 2가 두 번 덮이므로 정확한 덮개는 아닙니다.

남은 1이 가장 적은 열을 고르면(MRV) 탐색 나무가 극적으로 줄기 때문입니다. 1이 하나뿐인 열은 선택의 여지가 없어 바로 확정되고, 0개면 그 가지가 즉시 죽습니다. 무작위 행렬 300개로 재어 보면 MRV가 한 번도 지지 않고 많게는 열 배 넘게 노드를 줄입니다 — 이 계산기가 두 전략을 나란히 세는 이유입니다.

아닙니다. 알고리즘 자체는 그대로 알고리즘 X이고, DLX는 «지운 것을 되돌리기가 공짜인» 이중연결 리스트 구현 기법일 뿐입니다. 노드를 리스트에서 뺄 때 자기 자리의 포인터를 그대로 남겨 두면 되돌릴 때 그 포인터로 다시 끼워 넣을 수 있다는 것이 요점입니다. 이 계산기는 문제 크기가 작아 비트마스크로 구현했습니다.

바뀝니다. 스도쿠는 «칸 하나가 채워짐», «어느 행에 어느 숫자», «어느 열에 어느 숫자», «어느 상자에 어느 숫자» 네 종류의 열을 두고, 각 행이 «어느 칸에 어느 숫자를 넣는가» 하나가 됩니다. N퀸은 행·열이 필수 열이고 대각선은 «두 번 덮이면 안 되지만 안 덮여도 되는» 선택적 열이 되는데, 이 계산기는 필수 열만 다룹니다.

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

알아두면 좋은 점

  • 열은 32개, 행은 200개까지 다룹니다. 비트마스크로 구현했기 때문입니다.
  • 선택적 열(secondary column)은 지원하지 않습니다. 모든 열이 정확히 한 번 덮여야 합니다.
  • 해가 아주 많은 문제에서는 200개까지만 찾고 멈춥니다. 탐색 노드 수는 그때까지의 값입니다.
  • 무작위 행렬 1500개에서 모든 부분집합을 훑는 완전탐색과 해의 개수를 대조했고, 도미노 타일링의 알려진 완전매칭 개수(2×4=5, 3×4=11, 4×4=36, 3×6=41)와도 맞춰 보았습니다.

함께 보면 좋은 도구

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