P-NP

CS/알고리즘

컴퓨터 과학에서 어떤 문제가 쉬운지 어려운지, 더 나아가 해결 가능한지 불가능한지를 판단하는 척도가 있다. 

바로 P-NP 문제이다.

 

P-NP

P-NP는 컴퓨터 과학에서 어떤 문제가 쉬운 문제인지 어려운 문제인지, 더 나아가 해결이 가능한지 불가능한지를 판단하는 척도가 되는 개념이다.

결정 문제와 최적화 문제

먼저, 문제의 유형을 이해해야 한다.

결정 문제 (Decision Problemn)

어떤 문제가 주어졌을 때 yes 또는 no로 대답할 수 있는 문제를 말한다.

  • "이 배열이 정렬되어 있는가?" → Yes/No
  • "이 그래프에서 A에서 B로 가는 경로가 존재하는가?" → Yes/No

 

최적화 문제 (Optimization Problem)

어떤 상황이 주어졌을 때 최적의 해를 찾는 문제이다.

  • "배열을 정렬하라"
  • "가장 짧은 경로를 찾아라"

 

튜링 머신

문제의 난이도를 이해하려면 튜링 머신이라는 개념을 알아야 한다.

결정론적 튜링 머신

  • 문제를 일방향으로 해결 (accept 또는 reject)
  • 오늘날의 일반적인 컴퓨터와 동일한 개념

비결정론적 튜링 머신

현재 상태에서 다음 상태로 이동할 때 다음 상태가 여러 개 공존하는 머신이다.

  • 현실 세계에는 존재하지 않지만 이론적으로 상상한 개념
  • 여러 경우를 동시에 탐색할 수 있는 "분신술"같은 능력
  • 결정론적 튜링 머신으로는 오래 걸리는 문제를 빠르게 해결 가능

예를 들어, 미로 찾기 문제에서:

  • 결정론적 튜링 머신: 한 길씩 차례대로 시도
  • 비결정론적 튜링 머신: 모든 길을 동시에 시도

 

시간 복잡도 분류

분제의 난이도는 시간복잡도로 측정한다.

다항 시간 (Polynomial Time)

입력 크기 n에 대해 다항식으로 표현되는 시간 복잡도 다항 시간에 속하는 것들:

  • O(1) - 상수 시간
  • O(log n) - 로그 시간
  • O(n) - 선형 시간
  • O(n²), O(n³) - 다항 시간

다항 시간에 속하지 않는 것들:

  • O(2^n) - 지수 시간
  • O(n!) - 팩토리얼 시간

다항 시간 알고리즘은 "효율적"이라고 간주되고, 지수 시간 이상은 "비효율적"이라고 간주된다.

 

문제 분류

P 문제 (Polynomial time)

결정론적 튜링 머신을 사용해 다항 시간 내에 답을 구할 수 있는 결정 문제 즉, 일반 컴퓨터로 효율적으로 풀 수 있는 문제이다.

특징

  • 상수, 로그, 다항 시간으로 풀 수 있는 "쉬운" 문제
  • 현대 컴퓨터로 효율적으로 해결 가능

대표적인 예

  • 정렬 (Sorting): O(n log n)
  • 이진 탐색 (Binary Search): O(log n)
  • 최단 경로 (Dijkstra): O(E log V)

 

NP 문제 (Nondeterministic Polynomial time)

비결정론적 튜링 머신을 사용해 다항 시간 내에 답을 구할 수 있는 결정 문제 즉, "분신술"이 가능한 컴퓨터라면 효율적으로 풀 수 있는 문제이다.

특징

  • 해를 찾기는 어렵지만, 주어진 해가 올바른지 검증하는 것은 다항 시간에 가능
  • P 문제보다 어려운 문제

예를 들어 스도쿠의 경우 해를 찾기에는 어렵고 오래 걸리지만, 주어진 답이 맞는지 확인하는 것은 쉽고 빠르다.

대표적인 예

  • 해밀턴 경로 문제 (결정 버전)
  • 외판원 문제 (결정 버전)
  • 부분집합 합 문제

 

NP-Hard 문제

모든 NP 문제를 다항 시간 내에 어떤 문제 A로 환원시킬 수 있다면, 그 문제 A를 NP-Hard 문제라고 한다. 

환원(Reductions)이란?
A. n개의 숫자를 오름차순으로 정렬
B. n개의 숫자 중 가장 작은 값 찾기
C. n개의 숫자 중 가장 큰 값 찾기
D. n개의 숫자 중 중간 값 찾기​
→ A를 해결하면 B, C, D가 자동으로 해결됨
→ B, C, D는 모두 A로 환원될 수 있음

특징

  • 다른 모든 NP 문제만큼 어렵거나 더 어려운 문제
  • 해결 가능한지조차 알려지지 않은 가장 어려운 문제
  • NP에 속하지 않을 수도 있음

대표적인 예

  • 외판원 문제 (최적화 버전)
  • 체스에서 이기는 전략 찾기

 

NP-Complete 문제

NP-Hard이면서 동시에 NP에 속하는 문제 즉, 풀 수 있는 문제 중에서 가장 어려운 문제이다.

특징

  • 풀 수 있는 문제 중 가장 어려운 문제
  • NP-Complete 문제 하나만 다항 시간에 풀면, 모든 NP 문제를 다항 시간에 풀 수 있음

대표적인 예

  • 외판원 문제 (결정 버전): "총 비용이 k 이하인 경로가 존재하는가?"
  • 해밀턴 경로 문제 (결정 버전): "모든 정점을 한 번씩만 방문하는 경로가 존재하는가?"
  • 부분집합 합 문제: "합이 정확히 k가 되는 부분집합이 존재하는가?"

 

외판원 문제로 보는 차이

같은 외판원 문제도 어떻게 질문하느냐에 따라 분류가 달라진다.

외판원 문제 (최적화 버전)

  • 질문: "모든 도시를 방문하는 최소 비용 경로는?"
  • 분류: NP-Hard (NP-Complete 아님)
  • 이유: 최적해를 찾는 것은 검증보다 더 어려움

외판원 문제 (결정 버전)

  • 질문: "비용이 k 이하인 경로가 존재하는가?"
  • 분류: NP-Complete
  • 이유: 주어진 경로가 조건을 만족하는지 검증은 다항 시간에 가능

 

P vs NP: 밀레니엄 문제

P = NP 인가? 즉, P 집합과 NP 집합이 같은가?

이 문제는 수학계의 7대 밀레니엄 문제 중 하나로, 아직 증명되지 않았다. 이 문제를 해결하면 100만 달러의 상금을 받을 수 있다.

P = NP 라면?

  • 모든 NP 문제는 결정론적 튜링 머신(일반 컴퓨터)으로 다항 시간 내에 해결 가능
  • 암호화, 최적화 등 많은 분야에 혁명적 변화
  • 현재 어렵다고 여겨지는 많은 문제들이 효율적으로 풀림
  • 문제: 현재 사용되는 대부분의 암호 시스템이 무용지물이 됨

P ≠ NP라면?

  • NP 문제는 결정론적 튜링 머신으로 다항 시간 내에 해결 불가능
  • 현재 사용되는 암호화 시스템의 안전성이 이론적으로 보장됨
  • 일부 문제는 본질적으로 어려울 수밖에 없음

대부분의 컴퓨터 과학자들은 P ≠ NP일 것이라고 믿고 있지만, 아직 누구도 증명하지 못했다.

 

정리

  설명 난이도
P 다항 시간에 풀 수 있는 문제 쉬운 문제
NP 비결정론적으로 다항 시간에 풀 수 있는 문제 P보다 어려운 문제
NP-Complete NP이면서 NP-Hard인 문제 풀 수 있는 문제 중 가장 어려운 문제
NP-Hard 모든 NP 문제를 환원할 수 있는 문제 가장 어려운 문제 (풀 수 있는지조차 미지수)

 

P-NP는 컴퓨터 과학에서 문제의 난이도를 분류하는 핵심 개념이다. 
P 문제는 효율적으로 풀 수 있지만, NP-Complete 문제는 현재까지 효율적인 해법이 발견되지 않았다. P = NP인지 아닌지는 여전히 미해결 문제이며, 이를 증명하는 사람은 컴퓨터 과학 역사에 길이 남을 것이다. 

 

실무에서 NP-Complete 문제를 만나면, 정확한 최적해 대신 근사 알고리즘이나 휴리스틱을 사용해 실용적인 해를 찾는 것이 일반적이다.

'CS > 알고리즘' 카테고리의 다른 글

이진 탐색 (Binary Search)  (0) 2026.02.04
동적 프로그래밍 (Dynamic Programming)  (0) 2025.11.18
정렬 (Sort)  (0) 2025.11.17
재귀 (Recursion)  (0) 2025.11.17
'CS/알고리즘' 카테고리의 다른 글
  • 이진 탐색 (Binary Search)
  • 동적 프로그래밍 (Dynamic Programming)
  • 정렬 (Sort)
  • 재귀 (Recursion)
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Pages Router
    앱 라우터
    Spa
    알고리즘
    Next.js
    페이지 라우터
    memory
    C
    algorithm
    함수 타입
    타입 좁히기
    generic
    CS
    Trouble Shooting
    cs50
    App Router
    바닐라 자바스크립트
    emotion diary
    javascript
    useState
    배열
    인터페이스
    react
    제네릭
    문자열
    자료구조
    클래스
    트러블 슈팅
    ai 감성 일기장
    typescript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
P-NP
상단으로

티스토리툴바