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)
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19)
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4)
        • 네트워크 (1)
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바