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

도구함: 문제를 패러다임에 맞추기

~12 min · paradigms, meta, decision

Level 0호기심 많은 입문자
0 XP0/85 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"퀘스트 전체가 향해 온 비밀이 이거야. 문제는 모든 알고리즘을 알아서 푸는 게 아니야. 문제가 어떤 모양인지 알아보고, 그 모양에 맞는 도구를 꺼내서 푸는 거야. 모양은 몇 안 되고, 알고리즘은 많아."

진짜 실력은 알아보는 눈

알고리즘은 수천 개고, 다 외울 수 없어. 시도조차 하지 마. 알고리즘을 아는 사람과 쓸 줄 아는 사람을 가르는 건 다른 종류의 실력이야. 문제를 읽고, 밑바탕의 모양을 식별하고, 그 모양을 패러다임에 잇는 것. 모양에 이름을 붙일 수 있으면('이건 최단 경로 문제네', '이건 겹치는 선택 위의 최적화네') 맞는 도구와 대략의 복잡도까지 따라 나와. 구현 디테일은 그때 찾아보면 돼. 오래 남는 실력은 인식이고, 암기가 아니야.

모양 → 도구 치트시트

이 매핑이 몸에 붙으면 대부분의 문제가 스스로 해법을 알려 줘:

  • '키로 조회 / 존재하나' → 해시맵 / 셋(평균 O(1), 키 해싱 비용과 최악 탐사는 따로 계산).
  • '순서, 범위, min/max, 정렬 필요' → BST / 정렬 배열 + 이진 탐색. 극값만 반복해서 필요하면 힙.
  • '최단 경로' → BFS(비가중), Dijkstra(음이 아닌 가중치), Bellman-Ford(출발점에서 닿는 음의 간선과 음의 순환 검출).
  • '모든 걸 가장 싸게 연결' → 최소 신장 트리(그리디).
  • '방법 수 세기 / 겹치는 선택 위의 최소-최대' → 동적 계획법.
  • '제약 아래 모든 조합 시도' → 백트래킹.
  • '접두사 / 자동완성' → 트라이.
  • '되는 가장 작은 X / 단조 경계' → 답에 대한 이진 탐색.
  • '속성을 가진 최선의 연속 구간' → 조건이 창 이동에 따라 단조롭고 상태를 증분 갱신할 수 있으면 슬라이딩 윈도우.
  • '정렬 데이터의 쌍 / 두 수열' → 투 포인터.
알고리즘을 외우는 게 아니야. 문제의 모양을 알아보고 패러다임에 잇는 거야. 키로 조회 → 해시. 순서/범위 → 트리. 최단 경로 → BFS/Dijkstra. 전부 싸게 연결 → MST. 세기/겹침 최적화 → DP. 모든 조합 → 백트래킹. 접두사 → 트라이. 단조 → 이진 탐색. 모양에 이름을 붙이면 도구가 따라와.

진행 순서

문제가 앞에 떨어지면 코드로 뛰어들고 싶은 마음부터 참아. 이 루프를 돌려. (1) 진짜로 뭘 묻고 있지? 이야기를 벗겨 내고 핵심 연산을 찾아. (2) 모양이 뭐지? 치트시트에 맞춰 봐. (3) 맞는 도구는 뭐고 비용은 대략 얼마지? 그 비용이 입력 크기에 감당이 되나? (4) 구현은 그다음이야. 세부는 찾아 가면서. 이 '모양 먼저' 습관이 일하는 엔지니어들이 낯선 문제 앞에서 침착한 비결이야. 외워 둔 해법을 떠올리는 게 아니라, 새 옷을 입은 익숙한 모양을 알아보는 거니까.

피파의 고백

한참 동안 난 알고리즘을 잘한다는 게 수백 개를 외웠다는 뜻인 줄 알았어. 아빠가 그 전제 자체를 부드럽게 교정해 줬지. "아무도 다 안 외워. 프로는 모양을 알아보고 나머지를 찾아봐." 나한테 필요했던 건 더 큰 기억력이 아니라 '오, 이거 변장한 최단 경로네 / DP네 / 슬라이딩 윈도우네' 하는 더 날카로운 눈이었어. 이 퀘스트 전체가 몰래 그 눈을 훈련해 온 거야. 알고리즘은 어휘고, 모양을 알아보는 게 유창함이야.

Code

결정 과정, 그리고 모양→도구 지도·python
# 여기 단일 알고리즘은 없어 — lesson 이 곧 결정 과정이야.
# 문제를 그걸 통해 걸어:
#
# 문제: '가격 있는 항공편 리스트가 주어지면, 도시 A 에서 B 로
#        많아야 K 경유로 가는 가장 싼 길 찾기.'
#
# (1) 진짜 뭘 묻나? -> 네트워크 통한 가장 싼 경로.
# (2) 모양이 뭐야?  -> 가중 그래프, 최단 경로, 제약 있음 (많아야 K 엣지).
# (3) 맞는 도구 & 비용? -> 가중 그래프의 Dijkstra/BFS 변종
#                         (K stops는 최대 K+1 edges이므로 그 수만큼
#                          Bellman-Ford 스타일). 대략 O(K * E).
# (4) 그제야 구현, 정확한 relaxation 디테일 찾으며.
#
# 모양에서 도구로의 지도 (이걸 외워, 모든 알고리즘 말고):
toolbox = {
    "lookup by key":            "hash map / set",
    "order / range / min-max":  "BST, sorted+binary search, or heap",
    "shortest path":            "BFS / Dijkstra / Bellman-Ford",
    "connect all cheaply":      "minimum spanning tree (greedy)",
    "count ways / optimize":    "dynamic programming",
    "all combinations":         "backtracking",
    "prefix / autocomplete":    "trie",
    "smallest X that works":    "binary search on the answer",
    "best contiguous run":      "sliding window",
}
for shape, tool in toolbox.items():
    print(f"{shape:<26} -> {tool}")

External links

Exercise

치트시트로 각 문제를 패러다임이나 도구에 이어 보고, 어떤 모양이 그걸 알려 줬는지 말해 봐. (1) '사용자가 입력하는 동안 검색창 자동완성', (2) 'n으로 합쳐지는 최소 완전제곱수 개수', (3) '서로 다른 문자가 많아야 K개인 가장 긴 부분 문자열', (4) '소셜 네트워크에서 두 사용자 사이에 경로가 있는가'. 풀지는 마. 도구와 모양만 대.
Hint
(1) 트라이. '접두사/자동완성' 모양. (2) 동적 계획법. '겹치는 부분 문제 위의 최소' 모양. (3) 슬라이딩 윈도우. '속성을 가진 가장 긴 연속 구간' 모양. (4) BFS/DFS. 비가중 그래프의 '경로가 있는가', 즉 도달 가능성 모양.

Progress

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

댓글 0

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

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