3주차는 알고리즘 영역에서 가장 악명 높은 동적 계획법(Dynamic Programming)과 그리디(Greedy), 그래프 최단 경로(다익스트라 알고리즘)를 학습함과 동시에, 하드웨어 레벨에서 CPU와 메모리가 어떻게 전기적 신호로 소통하는지 컴퓨터 구조의 시스템 버스(System Bus) 원리를 탐구하는 주차였습니다.
[동적 계획법의 하위 문제 캐싱 메커니즘]
복잡한 문제 (Size N)
│
├─ 하위 문제 1 (Size N-1) ──► 계산 완료 후 메모이제이션 테이블에 캐싱
│
├─ 하위 문제 2 (Size N-2) ──► 캐시 테이블에서 O(1) 즉시 인출! (중복 연산 방지)
│
└─ 점화식 기반 최적해 합성 (상향식 Tabulation 또는 하향식 Memoization)
"몸이 너무 아팠고, 노트북이 수리중이어서, 코드,CS둘다 하긴 했지만 별로 였던 한주"
3주차는 정글 입소 이래 가장 가혹한 외부적 시련이 닥친 한 주였습니다. 환절기 면역력 저하와 누적된 피로로 인해 몸이 심하게 아파 정상적인 컨디션을 유지하기 힘들었습니다. 설상가상으로 코딩을 해야 할 주력 노트북마저 전원 및 하드웨어 결함으로 서비스 센터에 수리를 맡겨야 했습니다.
온전치 않은 몸을 이끌고 도서관의 임시 PC나 스마트폰으로 알고리즘과 CS 강의를 들으며 버텼지만, 개발 환경이 깨져 버리자 코드 작성의 몰입도가 현저히 떨어졌습니다. 코드도 치고 CS 공부도 하긴 했으나, 내가 원하는 만큼의 학습량을 달성하지 못했다는 자책감과 동료들보다 뒤처지고 있다는 극심한 불안감에 시달렸습니다.
피보나치 수열과 같은 분할 정복 문제에서 단순 재귀를 사용하면 동일한 하위 문제들이 트리 형태로 중복 계산되어 시간복잡도가 으로 폭증합니다. 이미 계산된 결과를 배열이나 딕셔너리에 저장하는 메모이제이션(Memoization)을 적용하면 모든 하위 문제를 단 한 번만 계산하여 으로 최적화됩니다.
# [상향식 타뷸레이션(Tabulation)을 적용한 피보나치 DP]
def fibonacci_dp(n):
if n <= 1:
return n
dp = [0] * (n + 1)
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[n]
컴퓨터의 3대 물리 구성 요소인 CPU, RAM, 입출력 장치는 메인보드 상의 공통 전송로인 시스템 버스(System Bus)로 연결되어 있습니다.
[CPU와 메인 메모리 간 3대 시스템 버스 연결 구조]
+-------------------+ +-------------------+
| | ──(주소 버스: 단방향, Address Bus)──► | |
| 중앙처리장치 | ◄──(데이터 버스: 양방향, Data Bus)──► | 주기억장치 |
| (CPU) | ──(제어 버스: 제어 신호, Control Bus)─► | (RAM) |
+-------------------+ +-------------------+
이 주차를 지나며 배운 인생의 커다란 깨달음은 "최상의 컨디션에서 잘 달리는 것은 누구나 할 수 있지만, 최악의 조건 속에서도 완전히 손을 놓지 않고 끈을 유지하는 것이 진짜 실력"이라는 점이었습니다.
몸이 아프고 장비가 고장 났다고 해서 그대로 자리에 누워버렸다면 3주차의 모든 지식을 놓쳤을 것입니다. 비록 최고의 몰입도를 내지는 못했더라도, 서툰 임시 환경에서 개념 정리를 하고 팀원들에게 내 상황을 투명하게 공유하며 최소한의 학습 보폭을 유지했던 경험은, 향후 어떤 예측 불가능한 프로젝트 위기가 닥쳐도 버텨낼 수 있는 든든한 내면의 맷집이 되었습니다.
답변: 첫째는 최적 부분 구조(Optimal Substructure)로, 전체 문제의 최적해가 하위 문제들의 최적해로부터 구성될 수 있어야 합니다. 둘째는 중복 부분 문제(Overlapping Subproblems)로, 동일한 하위 문제가 재귀 탐색 과정에서 여러 번 반복하여 호출되어야 합니다. 중복 호출이 없는 문제(예: 병합 정렬)는 분할 정복으로 해결하며, 중복이 존재할 때만 메모이제이션을 통한 DP 캐싱이 유효합니다.
답변: 주소 버스(Address Bus)의 폭이 32비트라는 것은 CPU가 보낼 수 있는 고유한 메모리 주소의 가짓수가 개임을 의미합니다. 컴퓨터 메모리는 바이트(Byte, 8비트) 단위로 주소가 부여되므로, 가 하드웨어적으로 접근 가능한 절대적 한계선이 됩니다. 4GB를 초과하는 메모리를 물리적으로 직접 다루기 위해서는 주소 버스가 64비트로 확장되어야 합니다.
답변: 단순 배열을 사용하여 매번 최단 거리 정점을 선형 탐색()하면 전체 시간복잡도는 가 됩니다. 반면 최소 힙(Min-heap) 기반 우선순위 큐를 적용하면 거리가 가장 짧은 정점을 인출하는 비용이 로 단축되며, 모든 간선에 대한 거리 갱신 연산()을 포함하여 전체 시간복잡도를 로 획기적으로 개선할 수 있습니다.
