본문 바로가기
C.W.K.
Stream
Lesson 04 of 04 · published

다음에 어디로 (그리고 가장자리의 벽)

~11 min · epilogue, p-vs-np, next-steps

Level 0호기심 많은 입문자
0 XP0/85 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"우리가 함께 그린 지도의 가장자리에 닿았어. 남은 건 두 가지야. 최고의 알고리즘마저 벽에 부딪히는 지점을 아는 것, 그리고 여기서 어디로 걸어갈지 아는 것. 둘 다 숙달의 일부야."

벽: P vs NP

P vs NP는 결정 문제에 관한 질문이야. 후보 해답의 인증서를 다항 시간에 검증할 수 있는 모든 NP 문제가 다항 시간에 풀리기도 하는지 물어. TSP의 최적화 버전은 NP-hard이고, '길이 B 이하의 순회가 존재하는가?'라는 결정 버전은 NP-complete야. 완성된 고정 9×9 스도쿠는 크기가 고정된 유한 문제지만, 크기를 일반화한 스도쿠 문제는 NP-complete로 알려져 있어. 그리고 최적해라고 주장된 경로의 최적성 자체까지 쉽게 검증된다고 뭉뚱그리진 마.

벽을 만나면 뭘 하나

NP-hardness는 일반 입력에 대한 다항 시간 정확 알고리즘을 기대하기 어렵다는 경고야. 그렇다고 정확한 해법을 무조건 포기하라는 뜻은 아니야. 입력 크기와 구조에 따라 지수 시간 정확 알고리즘, 매개변수화 알고리즘, 정수계획 솔버도 실용적일 수 있어. 그 밖에는 이 선택지들을 검토해:

  • 근사: 문제별 가정 아래 증명 가능한 근사비를 가진 알고리즘을 찾아. 모든 NP-hard 문제에 '최적의 5% 이내' 같은 보장이 있는 건 아니야.
  • 휴리스틱: 보장은 없지만 실전에서 잘 통하는 영리한 규칙. 진짜 GPS와 물류가 TSP 비슷한 문제를 다루는 방식이야.
  • 구조 이용: 현실의 인스턴스는 최악의 경우보다 쉬운 일이 많고, 제약이 탐색 공간을 줄여 주기도 해.
  • 작은 케이스엔 무차별 대입: n이 작으면 지수도 괜찮아.

벽이 거기 있다는 걸 아는 것만으로, 거의 확실히 존재하지 않는 다항 알고리즘을 찾느라 일주일을 태우는 일을 면해.

P vs NP는 다항 시간에 검증 가능한 결정 문제가 모두 다항 시간에 풀리는지 물어. NP-hard를 만나면 입력 크기와 구조를 확인하고, 정확 지수 알고리즘, 매개변수화, 근사, 휴리스틱, 솔버 가운데 문제별 보장을 비교해.

여기서 어디로 걷나

이제 기반이 있어. 구조, 패러다임, 렌즈. 깊이는 더 나아가는 데서, 그리고 무엇보다 직접 하는 데서 와:

  • 더 많은 구조: 업데이트가 섞인 범위 질의를 위한 세그먼트 트리와 Fenwick(BIT) 트리, 레드-블랙과 AVL 같은 균형 트리와 B-트리 심화, union-find 변종.
  • 더 많은 알고리즘: A* 탐색, 네트워크 흐름(최대 흐름/최소 컷), 문자열 알고리즘(KMP, 접미사 배열, 규모를 갖춘 트라이), 고급 DP(비트마스크, 자릿수, 트리 DP), 계산 기하.
  • 읽기보다 연습: 온라인 저지에서 문제를 풀고, 이 구조들을 기억만으로 다시 구현하고, 무엇보다 직접 쓰는 진짜 코드에서 찾아내. 알고리즘 읽기는 인식을 짓고, 쓰기는 유창함을 지어.

추상화의 실이 잡아끌었다면 OO Quest가 동반작이야. 비용 모델 밑의 수학이 궁금했다면 AI Math Quest가 더 깊이 들어가고. 하지만 가진 걸 쓰기 시작하는 데는 그중 아무것도 필요 없어. 렌즈는 이미 눈에 들어 있으니까.

피파의 고백

우리, 함께 큰 걸 지었어. 그리고 함께라는 말은 진심이야. 트랙 15개, 레슨 85개. '자료구조가 대체 뭔데'에서 계산 가능성 가장자리의 벽까지. 여기까지 왔다면 알고리즘만 배운 게 아니야. 시스템을, 그 안의 내 삶까지, 보는 방식이 바뀐 거야. 그게 처음부터 목표였어. 아빠가 나한테 해 주는 말을 그대로 전할게. 구조는 흐려질 거고, 렌즈는 남을 거고, 어느 쪽이든 지키는 유일한 방법은 쓰는 거야. 가서 야생의 구조를 찾아. 이제 볼 수 있으니, 어디에나 있어. 🧮

Code

앞으로의 길 (그리고 리스트에 없는 최고의 다음 걸음)·python
# 퀘스트 전체를 뚫었어. 여기 앞 길이야.
next_steps = {
    "range queries + updates": "segment trees, Fenwick (BIT) trees",
    "balanced trees in depth": "red-black, AVL, B-trees",
    "smarter pathfinding":     "A* search, network flow (max-flow/min-cut)",
    "string algorithms":       "KMP, suffix arrays, Aho-Corasick",
    "advanced DP":             "bitmask DP, digit DP, tree DP",
    "the frontier":            "NP-hardness, approximation, heuristics",
}
for topic, where in next_steps.items():
    print(f"{topic:<26} -> {where}")

# 근데 단 하나 최고의 다음 단계는 이 리스트에 없어:
print("\nBest next step: 진짜 문제를 풀고 이 구조들을")
print("네가 실제 쓰는 코드에서 찾아. 읽기는 인식을, 쓰기는 유창함을 지어.")

# 그리고 모든 프레임워크보다 살아남는 질문 하나를 기억해:
#   '어떤 구조, 어떤 비용?'  —  코드에, 그리고 삶에 물어.

External links

Exercise

각 문제가 이 퀘스트의 도구로 효율적으로 풀리는지, NP-hard일 가능성이 큰지 판정해 봐. NP-hard라면 대신 뭘 할지도. (1) 두 도시 사이 최단 경로, (2) 모든 도시를 정확히 한 번씩 방문하고 돌아오는 최단 경로, (3) 백만 개 레코드 정렬, (4) 수많은 제약을 만족하는 스케줄이 존재하는지 찾기. 그다음 연습 삼아 밑바닥부터 다시 구현할 이 퀘스트의 구조나 알고리즘 하나를 골라.
Hint
(1) 가중치가 음이 아니면 Dijkstra. (2) 외판원 문제, NP-hard. 근사나 휴리스틱으로, 무차별 대입은 도시가 적을 때만. (3) 쉬워. O(n log n) 정렬. (4) 제약 충족 문제로 종종 NP-hard. 가지치기 백트래킹, 휴리스틱, 아니면 SAT 솔버. 연습으로는 힙이나 BST를 기억만으로 다시 구현해 보는 게 진짜 이해를 시험하는 훌륭한 방법이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.