P와 NP: 답을 찾는 일과 확인하는 일의 차이

·설명 약 4분·작성: 해비·블로그 소개

P와 NP는 각각 어떤 결정 문제의 부류인가요?

P는 입력 크기에 대한 다항 시간 알고리즘으로 풀 수 있는 문제들의 부류입니다. NP는 예라는 답에 대해 다항 크기의 증명서를 다항 시간에 확인할 수 있는 문제들의 부류입니다.

적용 조건·범위: 분석 조건: n≥3의 Boolean 정사각 행렬과 도시 인덱스 순환 후보입니다. 결정 문제의 효율적 후보 검증을 보여 주며 탐색 알고리즘이나 미해결 문제의 해답은 아닙니다.

본문 근거: Clay Mathematics Institute — P vs NP

읽기 전에 알아두면 좋아요

아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.

개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.

과정 위치와 선택 복습 안내

과정 위치: 유량·상태 압축과 계산 복잡도 (선택) · 알고리즘 개념

과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.

JavaScript로 문법·실행 복습하기 (선택)

개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.

P와 NP: 답을 찾는 일과 확인하는 일의 차이 주제를 표현한 밝은 일러스트와 작은 곰 표지

P와 NP를 비교할 때의 질문은 “정답 후보를 효율적으로 확인할 수 있는 문제를 효율적으로 풀 수도 있는가?”입니다. NP를 단순히 어렵거나 느린 문제의 이름으로 쓰면 의미가 달라집니다.

선수 지식: 입력 크기와 다항·지수 증가의 차이, 그래프의 정점·간선을 알아야 합니다.

  • 찾기와 검증을 다른 작업으로 구분합니다.
  • 결정 문제와 최소 비용을 구하는 최적화 문제를 구분합니다.

제시된 방문 순서를 확인하는 일부터 해 봅니다

도시를 모두 한 번씩 지나 출발점으로 돌아오는 순서가 있는지 묻는다고 해 보겠습니다. 누군가 [0,1,2,0]을 후보로 내놓으면 모든 순서를 새로 찾지 않고도 각 도시가 한 번씩 나오는지, 이어지는 간선이 있는지, 마지막이 출발점인지 확인할 수 있습니다. 이 후보처럼 정답 확인에 함께 제공하는 자료를 증명서라고 부릅니다.

도시 0에서 1, 2를 지나 0으로 돌아오는 후보와 중복 방문 후보를 비교하는 검사
그림의 간선이 있는 예에서는 [0,1,2,0]을 확인할 수 있습니다. [0,1,1,0]은 도시 1이 중복되고 2가 빠집니다. 후보 하나의 확인과 모든 후보 탐색은 다른 작업입니다. 원본 보기 (새 탭)
작은 입력에서 달라지는 상태
후보 확인 결과 이유
[0,1,2,0] 간선이 모두 있으면 통과 각 도시 한 번, 출발점 복귀
[0,1,1,0] 거절 1을 중복 방문하고 2는 빠짐
[0,1,2,1] 거절 출발점으로 닫히지 않음

검사 함수가 true를 돌려줬다는 것은 제시된 후보가 조건을 만족한다는 뜻입니다. false이면 그 후보가 틀렸다는 뜻일 뿐, 다른 후보까지 모두 없다는 증거는 아닙니다. 이 차이를 놓치면 검증 함수를 전체 해법처럼 오해하게 됩니다.

P도 NP에 포함됩니다

여기서는 예·아니요로 답하는 결정 문제를 이야기합니다. P는 입력 크기에 대한 다항 시간 알고리즘으로 풀 수 있는 문제들의 부류입니다. NP는 예라는 답에 대해 다항 크기의 증명서를 다항 시간에 확인할 수 있는 문제들의 부류입니다. P 문제는 답을 계산해 확인할 수 있으므로 P에 속하면 NP에도 속합니다.

P에서 계산한 답을 확인할 수 있으므로 P가 NP에 포함되는 관계
P는 다항 시간에 풀 수 있는 결정 문제이고, NP는 예라는 답의 증명서를 다항 시간에 확인할 수 있는 결정 문제입니다. P⊆NP는 알려져 있지만 P=NP인지는 해결되지 않았습니다. 원본 보기 (새 탭)

P=NP인지는 아직 해결되지 않았습니다. 따라서 어떤 알고리즘을 아직 모른다는 이유만으로 그 문제에 빠른 알고리즘이 존재하지 않는다고 단정하면 안 됩니다. 여기서 “빠름”은 특정 PC의 몇 밀리초보다 입력이 커질 때의 점근적 다항 시간 의미입니다. 높은 차수나 큰 상수 때문에 다항 알고리즘도 실용적으로 느릴 수 있습니다.

가장 싼 경로와 예산 안의 경로 존재는 다른 질문입니다

외판원의 최소 비용을 직접 구하는 것은 최적화 문제입니다. “비용 K 이하의 순환이 존재하는가?”는 결정 문제입니다. P·NP의 정의를 적용할 때는 이처럼 어떤 질문을 분류하는지 먼저 밝혀야 합니다. NP-hard라는 말도 “NP와 똑같다”거나 “컴퓨터가 못 푼다”는 일상적 표현으로 바꿀 수는 없습니다.

최소 비용을 구하는 최적화 문제와 비용 K 이하의 순환 존재를 묻는 결정 문제의 비교
같은 순환도 무엇을 묻느냐에 따라 문제가 달라집니다. 최소 비용 자체를 구하는 질문과 예산 K 안의 순환이 있는지 묻는 질문을 구분합니다. 원본 보기 (새 탭)

아래 코드는 3개 이상 정점의 Boolean 인접 행렬과 후보 순환을 받는 작은 검증 예제입니다. 그래프 모양을 확인하는 부분까지 포함하면 O(n²), 후보 자체의 방문·간선 확인은 O(n)입니다. 이것은 P와 NP의 관계를 증명하는 코드가 아니라 찾기와 확인의 입력·작업이 어떻게 다른지 경험하기 위한 예제입니다.

전체 코드와 직접 실행

개념을 읽었다면 아래 예제를 직접 실행하며 상태 변화를 확인할 수 있습니다.

전체 JavaScript 코드와 실행 방법 펼치기

별도 패키지는 필요하지 않습니다. Node.js가 처음이라면 브라우저와 Node.js 시작 안내부터 확인하세요.

cycle-certificate.mjs 파일을 만들고 아래 전체 코드를 저장합니다.

function checkHamiltonianCycle(graph, route) {
  if (!Array.isArray(graph) || graph.length < 3 || !Array.isArray(route)) return false;
  const n = graph.length;
  for (let i = 0; i < n; i++) {
    if (!Array.isArray(graph[i]) || graph[i].length !== n) return false;
    for (let j = 0; j < n; j++) if (typeof graph[i][j] !== 'boolean') return false;
  }
  if (route.length !== n + 1 || route[0] !== route[n]) return false;
  const seen = new Set();
  for (let i = 0; i < n; i++) {
    const from = route[i], to = route[i + 1];
    if (!Number.isInteger(from) || from < 0 || from >= n || !Number.isInteger(to) || to < 0 || to >= n) return false;
    if (seen.has(from) || graph[from][to] !== true) return false;
    seen.add(from);
  }
  return seen.size === n;
}

const graph = [[false, true, true], [true, false, true], [true, true, false]];
console.log(checkHamiltonianCycle(graph, [0, 1, 2, 0]));
console.log(checkHamiltonianCycle(graph, [0, 1, 1, 0]));

파일이 있는 폴더의 터미널에서 실행합니다.

node cycle-certificate.mjs

기대 출력

true
false

비용과 적용 범위

시간: 예제의 행렬 형식 검사 O(n²), 후보 경로 검사 O(n)입니다.

행렬 n제곱 칸의 형식 검사와 길이 n인 후보 검사 및 방문 집합의 비용
3×3 격자는 크기를 보여 주는 예입니다. 전체 입력 형식을 검사하는 O(n²)와 후보 자체를 확인하는 O(n)을 따로 셉니다. 방문 집합의 추가 공간은 O(n)입니다. 원본 보기 (새 탭)

공간: 방문 집합 O(n) 추가 공간입니다.

분석 조건: n≥3의 Boolean 정사각 행렬과 도시 인덱스 순환 후보입니다. 결정 문제의 효율적 후보 검증을 보여 주며 탐색 알고리즘이나 미해결 문제의 해답은 아닙니다.

직접 확인해 보기

후보 [0,1,2,0]이 실패했다면 모든 정점을 방문하는 순환이 없다고 결론내릴 수 있나요?

후보 0, 1, 2, 0의 검사 실패에서 모든 순환의 부재를 결론낼 수 있는지 묻는 문제
주어진 후보의 검사 결과가 실패라고 가정합니다. 이 결과로 어디까지 알 수 있는지는 답을 펼치기 전에 생각해 보세요. 원본 보기 (새 탭)
답과 이유 확인

아닙니다. 그 순서가 조건을 만족하지 않는 것만 알 수 있습니다. 다른 후보 [0,2,1,0] 등이 가능한지는 따로 확인해야 합니다.

참고 자료

이 글이 도움이 되었나요?

조회 중

이어서 공부하기

체크포인트: 예제의 상태 변화를 손으로 추적하고 아래 문제에 적용하세요. 값이 없는 경우와 원소 하나인 경우도 설명해 보세요. 작은 기준 풀이와 비교하고 경로 복원·역방향 취소·입력 크기에 따른 비용을 설명하세요.

현재 공개된 추천 경로의 끝입니다. 같은 주제의 문제를 해설 없이 다시 풀거나 다른 심화 주제를 선택하세요.

권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.

원래 과정 목록 순서 (선택)

읽음 기록

읽음 — / 전체 30개 · 필수 0개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기