2-SAT 충족 가능성 계산기
「둘 중 하나는 참」인 조건을 여럿 넣으면 참·거짓 배정이 가능한지 판정하고 배정을 하나 찾아 줍니다. 절을 함의 두 개로 바꾸고 강한 연결 요소로 묶어 x와 ¬x가 같은 덩어리인지 보는 방식이며, 찾은 배정은 모든 절에 실제로 대입해 검산합니다.
한 줄에 「a b」처럼 둘 중 하나는 참이어야 하는 조건을 적습니다. 부정은 앞에 -를 붙입니다. 절 60개·변수 20개까지.
변수 3개 · 절 3개
배정이 있습니다
찾은 배정을 모든 절에 실제로 대입해 봤고 전부 참입니다. 절마다 변수가 둘뿐이라 이렇게 선형 시간에 풀립니다.
찾은 배정
절마다의 검산
| 절 | 함의로 바꾸면 | 대입 결과 |
|---|---|---|
| a ∨ b | ¬a → b, ¬b → a | 참 |
| ¬a ∨ c | a → c, ¬c → ¬a | 참 |
| ¬b ∨ ¬c | b → ¬c, c → ¬b | 참 |
(a ∨ b)는 「a가 거짓이면 b가 참이어야 한다」와 같으므로 절 하나가 화살표 두 개가 됩니다. 변수마다 정점 둘(x와 ¬x)을 두고 이 화살표를 간선으로 놓은 것이 함의 그래프입니다.
리터럴이 속한 덩어리
| 변수 | x의 덩어리 | ¬x의 덩어리 | 판정 |
|---|---|---|---|
| a | 0 | 1 | 다른 덩어리 |
| b | 1 | 0 | 다른 덩어리 |
| c | 0 | 1 | 다른 덩어리 |
강한 연결 요소(SCC)로 묶었을 때 x와 ¬x가 같은 덩어리에 있으면 배정이 없습니다. 같은 덩어리라는 것은 서로 오갈 수 있다는 뜻이고, 곧 「x가 참이면 거짓이어야 하고 거짓이면 참이어야 한다」이기 때문입니다. 그런 변수가 하나도 없으면 반드시 배정이 있습니다.
사용 방법
- 1한 줄에 절 하나씩 「a b」 형식으로 적습니다. 둘 중 하나는 참이어야 한다는 뜻입니다.
- 2부정은 앞에 -를 붙입니다. -a는 「a가 거짓」입니다.
- 3배정이 있는지 확인합니다.
- 4「절마다의 검산」에서 찾은 배정이 모든 절을 참으로 만드는지 봅니다.
- 5없다고 나오면 어느 변수가 자기 부정과 같은 덩어리인지 확인합니다.
자주 묻는 질문
「둘 중 하나는 참」인 조건이 여럿 있을 때 모두를 만족하는 참·거짓 배정이 있는지 묻는 문제입니다. (a ∨ b) ∧ (¬a ∨ c)처럼 절마다 변수가 정확히 둘인 경우를 말합니다.
절마다 변수가 둘이면 절이 함의로 바뀌기 때문입니다. (a ∨ b)는 「a가 거짓이면 b가 참이어야 한다」와 같아, 절 하나가 화살표 두 개가 됩니다. 셋만 되어도(3-SAT) 이 변환이 통하지 않습니다 — (a ∨ b ∨ c)는 하나가 거짓일 때 나머지 둘 중 하나라는 또 다른 논리합이 되기 때문입니다.
함의 그래프를 강한 연결 요소로 묶었을 때 x와 ¬x가 같은 덩어리에 있으면 배정이 없습니다. 같은 덩어리라는 것은 서로 오갈 수 있다는 뜻이고, 곧 「x가 참이면 거짓이어야 하고 거짓이면 참이어야 한다」이기 때문입니다. 그런 변수가 하나도 없으면 반드시 배정이 있습니다.
덩어리를 정점으로 본 축약 그래프에는 사이클이 없어 위상 정렬이 됩니다. x와 ¬x 중 위상 순서에서 뒤에 오는 쪽을 참으로 두면 모든 함의가 지켜집니다. 화살표가 앞에서 뒤로만 가므로 「참 → 거짓」인 화살표가 생길 수 없기 때문입니다.
「A 아니면 B는 반드시」 꼴의 제약이 잔뜩 있는 배치 문제에 쓰입니다. 좌석 배정, 지도에 이름표를 겹치지 않게 놓기, 회로에서 두 값 중 하나를 고르기 같은 문제가 2-SAT으로 바뀝니다.
있습니다. 이 도구는 그중 하나를 찾아 줍니다. 위상 순서에서 뒤에 오는 쪽을 참으로 두는 규칙을 쓰므로 언제나 같은 답이 나오지만, 다른 배정도 얼마든지 있을 수 있습니다.
전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.
알아두면 좋은 점
- 정답지는 모든 배정을 만들어 보는 전수 탐색입니다. 변수가 n개면 2ⁿ가지뿐이라 작은 판에서는 전부 훑을 수 있고, 함의 그래프도 SCC도 쓰지 않는 방법이라 서로를 검산합니다. 무작위 절 500벌에서 판정이 같은 것을 확인했으며, 풀리는 판과 안 풀리는 판이 각각 50벌 넘게 나오는지도 함께 검사해 한쪽만 보고 지나가지 않게 했습니다.
- 「배정이 있다」고 답했을 때는 그 배정을 모든 절에 실제로 대입해 참인지 확인합니다. 판정이 맞아도 배정을 잘못 뽑을 수 있기 때문이고, 그 결과를 화면에도 절마다 표로 보입니다.
- 절이 함의 두 개로 제대로 바뀌는지도 테스트로 고정했습니다. (a ∨ b)는 ¬a → b와 ¬b → a가 되어야 합니다.
- 덩어리를 나누는 데는 dev/tarjan-scc의 구현을 그대로 씁니다. 새로 짜지 않아 그쪽 테스트가 이쪽도 지켜 줍니다.
- 부정 기호는 -, !, ~, ¬을 모두 받고 구분자로 or·∨·쉼표를 인정합니다. 낱말을 하나만 적으면 (a ∨ a)로 봅니다.
- 절은 60개, 변수는 20개까지 다룹니다. 함의 그래프와 덩어리 표를 통째로 그리는 것이 목적이라 그보다 크면 화면이 읽히지 않습니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.