본문 바로가기
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
"자료구조와 알고리즘은 컴퓨터 과학 주제가 아니야. 지식을 가진 무엇이든 그걸로 뭘 할지 결정하는 방식이야. 비용이라는 제약 아래에서." — 아빠

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

대부분의 강의는 연결 리스트부터 구현시켜. 우린 일부러 아직 안 해. 렌즈 없이 구조만 배우면 "면접용으로 외운 것" 폴더에 들어가고, 면접이 끝나는 순간 사라지거든. 오래 남는 쪽은 렌즈야.

렌즈는 이거야. 지식을 가지고 그걸로 행동하는 시스템이라면 무엇이든, 네가 코드에서 하는 것과 똑같은 두 가지를 고르고 있어. 아는 걸 어떻게 구조화할지, 그리고 그 위 연산 하나하나가 뭘 치를지. 한 번 보이면 안 보이게 되돌릴 수가 없어.

둘러봐, 전부 여기 있어

  • 도서관은 책을 주제와 저자로 정렬해둬. 정렬된 색인인 셈이지. 그래서 한 권 찾는 데 서가를 다 걷는 대신 몇 단계면 끝나. 조회는 싸고 재배치는 비싸. 정렬된 배열과 똑같은 거래야.
  • 도시의 도로그래프야. 교차로가 노드, 거리가 간선. "집까지 가장 빠른 길"은 말 그대로 최단 경로 알고리즘이고, 내비게이션이 매번 하나씩 돌려.
  • 회사 조직도트리야. 루트 하나, 보고 라인이 가지, 맨 아래가 리프. "이 사람 상사의 상사가 누구지?"는 트리를 거슬러 올라가는 일이야.
  • 응급실 분류(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

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

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