C.W.K.
Stream
Lesson 04 of 05 · published

렌즈: 구조와 비용은 어디에나 있어

~12 min · foundations, worldview, lens

Level 0호기심 많은 입문자
0 XP0/85 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"자료구조와 알고리즘은 컴퓨터 과학 주제가 아니야. 지식을 가진 무엇이든 그걸로 뭘 할지 결정하는 방식이야 — 비용이라는 제약 아래에서." — 아빠

왜 이 트랙이 코드보다 먼저 오나

대부분 강의는 연결 리스트 구현시키는 걸로 시작해. 우린 아직 안 해, 일부러. 왜냐면 렌즈 없이 구조만 배우면, 그걸 "면접용으로 외운 것" 폴더에 넣고 면접 끝나는 순간 잊어버리거든. 남는 건 렌즈 쪽이야.

렌즈는 이거: 지식을 가지고 그걸로 행동하는 어떤 시스템이든, 네가 코드에서 하는 똑같은 두 선택을 하고 있어 — 아는 걸 어떻게 구조화할지, 그리고 그 위 각 연산이 뭘 치르는지. 한 번 보이면, 안 보이게 못 해.

둘러봐 — 전부 여기 있어

  • 도서관은 책을 주제와 저자로 정렬해 (정렬된 색인) 한 권 찾기가 모든 서가를 걷는 대신 몇 단계로 끝나. 싼 조회, 비싼 재배치 — 정렬된 배열과 똑같은 거래.
  • 도시의 도로그래프야: 교차로가 노드, 거리가 엣지. "집까지 가장 빠른 길" 은 말 그대로 최단 경로 알고리즘이고, 네 GPS 가 매번 하나 돌려.
  • 회사 조직도트리야: 루트 하나, 보고 라인 가지들, 맨 아래 리프들. "이 사람 상사의 상사가 누구?" 는 트리를 거슬러 올라가는 거야.
  • 응급실 분류(triage)우선순위 큐야: 선착순이 아니라 가장 급한 것 먼저. 심장마비가 삔 발목을 제치고 줄을 건너뛰어.
  • 브라우저 뒤로 가기 버튼스택이야: 마지막으로 본 페이지가 제일 먼저 돌아가는 곳.
  • DNA는 네 글자 알파벳 위의 문자열이고, 유전자 찾기는 부분 문자열 검색이야.

이 중 프로그래머가 만든 건 하나도 없어. 없을 때의 비용이 견딜 수 없어서 생겨난 구조들이야. 패턴은 컴퓨터보다 오래됐어; 컴퓨터는 그저 우리한테 이름을 붙이게 했을 뿐이야.

렌즈: 지식을 저장하고 그 위에서 작동하는 모든 시스템은 구조를 고르고 비용을 치러. DS&A 는 그 보편적 선택의 어휘야 — 그래서 네가 그걸 배운 어떤 언어보다 오래 살아남아.

OOP 연결 (아빠의 프레임)

아빠는 세상 전체를 객체 지향으로 봐 — 그리고 자료구조는 바로 그 아이디어를 구체화한 거야. 구조를 고르는 건 어떤 종류의 데이터에 맞는 추상화를 고르는 거야: 큐는 시간에 따른 공정함이라는 개념이고; 트리는 위계라는 개념이고; 그래프는 관계라는 개념이야. 컨테이너를 외우는 게 아니야. 현실이 자꾸 접혀 들어가는 모양들을 배우는 거야. 맨 마지막 트랙에서 여기로 돌아와 — 이게 퀘스트 전체의 척추야.

피파의 고백

아빠가 처음 "분류 줄은 우선순위 큐야" 라고 했을 때, 난 억지 비유라고 생각했어. 그러더니 내 하루 속 큐를 하나 대보라고 했고, 내 할 일 목록 전체가 우선순위 큐를 손으로 엉터리로 돌리는 거였다는 걸 깨달았어 — 급한 일 대신 시끄러운 일을 하고 있었던 거지. 그날 렌즈는 날 더 나은 코더로 만들진 않았어. 내 오후를 재정리하게 만들었어. 그때 아빠 말을 믿었어.

Code

일상의 세 구조·python
# 똑같은 세 구조, 세상에서 그리고 코드에서.
from collections import deque
import heapq

# 브라우저 뒤로 가기 = 스택 (마지막에 들어온 게 먼저 나감)
history = []
history.append("home"); history.append("docs"); history.append("profile")
print("back to:", history.pop())     # 'profile' —가장 최근 페이지

# 계산대 줄 = 큐 (먼저 들어온 게 먼저 나감)
line = deque(["alice", "bob"]); line.append("carol")
print("serve:", line.popleft())      # 'alice' — 도착 순으로 공정하게

# 응급실 분류 = 우선순위 큐 (선착순 아니라 가장 급한 것 먼저)
er = []
heapq.heappush(er, (5, "sprained ankle"))
heapq.heappush(er, (1, "heart attack"))   # 숫자 작을수록 더 급함
print("treat:", heapq.heappop(er)[1])      # 'heart attack' — 줄을 건너뜀

# 넌 이걸 코드로 만나기 한참 전에 브라우저, 계산대, 응급실로 만났어.

External links

Exercise

컴퓨터에 있지 않은 구조 셋을 네 하루에서 찾아봐. 각각에 대해 (1) DS&A 용어로 뭔지 (스택? 큐? 트리? 그래프? 정렬된 색인?), (2) 싸게 만들도록 배치된 연산 하나를 대봐. 보너스: 대가로 비싸게 만든 연산도 대봐.
Hint
구내식당 줄, 가계도, 지하철 노선도, 찬장에 쌓인 접시 더미, 날짜순 정렬된 이메일함. 싼 연산을 분명히 댈 수 있는 걸로 골라.

Progress

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

댓글 0

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

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