1장 컴퓨터 과학과 알고리즘
이번 강의에서 배울 것
- 알고리즘의 정의를 이루는 네 가지 조건을 말하고, 주어진 절차가 알고리즘인지 판정할 수 있다.
- m자리 덧셈 알고리즘과 유클리드 알고리즘을 표로 추적할 수 있다.
- GCD를 이용해 LCM·최소공통분모 알고리즘을 의사코드로 쓸 수 있다.
1장 컴퓨터 과학과 알고리즘
학습 흐름
"컴퓨터 과학 = 컴퓨터 공부"라는 오해 → 정의: 알고리즘에 대한 학문
↓
알고리즘의 4가지 조건 (well-ordered · unambiguous · effectively computable · halts)
↓
덧셈 알고리즘(Figure 1.2) 추적 → 유클리드 GCD → LCM·LCD (족보 단골)
↓
컴퓨팅의 역사: 기계식 계산기 → 전자식 → 1~5세대1. 컴퓨터 과학이란?
흔한 오해 세 가지
| 오해 | 왜 틀렸나 |
|---|---|
| The study of computers | 컴퓨터는 도구일 뿐. 천문학이 망원경 학문이 아닌 것과 같다 |
| The study of how to write programs | 프로그래밍은 알고리즘을 표현하는 한 방법 |
| The study of the uses and applications of computers and software | 응용은 결과물이지 학문의 중심이 아니다 |
이 네 항목이 그대로 이 과목의 목차입니다. 23장은 1번(수학적 성질), 45장은 2번(하드웨어), 6~7장은 3번(언어)입니다.
2. 알고리즘의 정의와 세 가지 연산
| 조건 | 뜻 | 위반 예 |
|---|---|---|
| Well-ordered | 다음에 무엇을 할지 순서가 분명 | "아무 단계나 먼저 하세요" |
| Unambiguous | computing agent가 추가 설명 없이 이해 (= primitive operation) | "Go back and do it again"(무엇을?), "Start over"(어디서부터?) |
| Effectively computable | 이해할 뿐 아니라 실제로 수행 가능 | "가장 큰 소수를 출력하라", 0으로 나누기, 음수의 실수 제곱근 |
| Produces a result & halts | 유한 번의 연산 후 결과를 내고 끝남 | infinite loop (무한 반복) |
알고리즘은 세 종류의 연산만으로 만들어집니다.
| 연산 | 영어 | 예 |
|---|---|---|
| 순차 | Sequential | Set the value of carry to 0 |
| 조건 | Conditional | If cᵢ ≥ 10 then … |
| 반복 | Iterative | While i ≤ m − 1, repeat steps 4–6 |
샴푸 알고리즘 두 개 (Figure 1.3)
(a) 반복 버전 (b) 나열 버전
1 Wet your hair 1 Wet your hair
2 Set WashCount to 0 2 Lather 3 Rinse
3 Repeat 4–6 until WashCount = 2 4 Lather 5 Rinse
4 Lather 5 Rinse 6 Stop
6 Add 1 to WashCount
7 Stop위 두 샴푸 알고리즘 중 일반적인 해법으로 더 좋은 것은 무엇이고, 왜 그런가? (머리를 1,000번 감아야 한다면?)
정답 확인
(a) 반복 버전이 더 좋다. 감는 횟수가 바뀌어도 숫자 2만 1000으로 고치면 되지만, (b)는 Lather/Rinse를 2,000줄 써야 한다. 반복(iteration)은 알고리즘의 길이를 입력 크기와 무관하게 유지해 준다.
근의 공식 x = (−b ± √(b² − 4ac)) / 2a 가 실수 범위에서 effectively computable하지 않은 경우 두 가지를 쓰시오.
정답 확인
- a = 0 → 0으로 나누기
- b² − 4ac < 0 → 음수의 실수 제곱근이 존재하지 않음
두 경우 모두 "뜻은 분명하지만 수행할 수 없는" 연산이다.
3. m자리 덧셈 알고리즘 (Figure 1.2)
두 m자리 수 a(m−1)…a₀ 와 b(m−1)…b₀ 를 더해 c(m)…c₀ 를 구합니다. 인덱스 0이 가장 오른쪽(일의 자리) 입니다.
Step 1 Set carry to 0
Step 2 Set i to 0
Step 3 While i ≤ m − 1, repeat steps 4–6
Step 4 cᵢ ← aᵢ + bᵢ + carry
Step 5 If cᵢ ≥ 10 then cᵢ ← cᵢ − 10, carry ← 1
Otherwise carry ← 0
Step 6 i ← i + 1
Step 7 Set cₘ to carry
Step 8 Print cₘ cₘ₋₁ … c₀
Step 9 Stop수업에서 배포한 Python 코드(cse102-lec-01-add-2026.py)가 바로 이 알고리즘입니다. 리스트를 일의 자리부터 저장한다는 점에 주목하세요.
m = 3
a = [3, 2, 1] # 123 을 거꾸로 저장 (a[0] = 일의 자리)
b = [6, 5, 4] # 456
c = [0, 0, 0, 0]
carry = 0
i = 0
while i <= m - 1:
c[i] = a[i] + b[i] + carry
if c[i] >= 10:
c[i] = c[i] - 10
carry = 1
else:
carry = 0
i = i + 1
c[m] = carry
c.reverse()
print(c) # [0, 5, 7, 9]위 알고리즘이 0178처럼 앞자리 0을 출력하지 않도록(즉 178) Step 8을 고치시오.
정답 확인
Step 8 Set k to m
While (k > 0) and (cₖ = 0) do
k ← k − 1
End of loop
Print cₖ cₖ₋₁ … c₀맨 왼쪽부터 0인 자리를 건너뛰되, c₀ 하나는 남겨야 0 + 0 = 0 같은 경우에 아무것도 출력하지 않는 문제가 없다. 그래서 조건이 k > 0이다.
4. 유클리드 알고리즘과 GCD·LCM (족보 단골)
교재 버전(연습문제 7)은 다음과 같습니다.
1 Get two positive integers; call the larger I, the smaller J
2 Divide I by J, and call the remainder R
3 If R is not 0, then set I to J, set J to R, and go back to step 2
4 Print J
5 Stop족보 유형: GCD 없이 LCM 구하기
LCM은 "a의 배수 중 b로도 나누어떨어지는 가장 작은 수"입니다.
Get values for a and b
Set multiple to a
While (multiple mod b ≠ 0) do
Set multiple to multiple + a
End of loop
Print multiple
Stop반복 횟수가 최악 b번이라 입력 값의 크기에 비례합니다(느림).
족보 유형: GCD로 LCM 구하기
Get values for a and b
Set x to a
Set y to b
While (y ≠ 0) do -- Euclid
Set r to x mod y
Set x to y
Set y to r
End of loop
Set lcm to (a / x) × b -- x 가 GCD
Print lcm
Stop분수 a/b + c/d 를 계산하기 위해 두 분모의 최소공통분모(LCD) 와 통분된 두 분자를 출력하는 의사코드를 쓰시오. (족보 문제 6 유형)
힌트 1 보기
LCD = LCM(b, d)입니다. 통분한 분자는 a × (LCD / b), c × (LCD / d)입니다.
정답 확인
Get values for a, b, c and d
Set x to b
Set y to d
While (y ≠ 0) do
Set r to x mod y
Set x to y
Set y to r
End of loop
Set lcd to (b / x) × d
Set newA to a × (lcd / b)
Set newC to c × (lcd / d)
Print lcd, newA, newC
Stop예: 1/4 + 5/6 → GCD(4, 6) = 2, LCD = 12 → 3/12 + 10/12
5. 컴퓨팅의 역사
초기 (~1940): 기계식 계산
| 인물 / 기계 | 기억할 점 |
|---|---|
| John Napier | logarithms 발명 → 곱셈을 덧셈으로 단순화 |
| Slide rule | 1622년경 첫 계산자 |
| Blaise Pascal — Pascaline | 초기 mechanical calculator. 톱니가 10칸 돌면 다음 자리로 carry를 넘기는 장치 (7 + 4 = 11) |
| Gottfried Leibnitz — Leibnitz's Wheel | 사칙연산 기계식 계산기 |
| Charles Babbage — Difference Engine | 6자리 사칙연산, 다항식 계산 |
| Babbage — Analytic Engine | 현대 컴퓨터와 놀랍도록 비슷한 설계 (실제로 완성 못 함) |
| Herman Hollerith | punched card 집계 기계 → Computer Tabulating Recording Company → 1924년 IBM |
컴퓨터의 탄생 (1940–1950)
| 기계 | 특징 |
|---|---|
| Mark I | 범용, electromechanical(릴레이·자석·기어) |
| ENIAC (1946) | 최초의 fully electronic general-purpose programmable computer |
| John Von Neumann | stored program computer 제안 → 프로그램도 데이터처럼 메모리에 저장 |
| EDVAC (1951) | 펜실베이니아 대학의 초기 stored program 컴퓨터 |
현대 (1950~): 세대 구분
| 세대 | 기간 | 핵심 키워드 |
|---|---|---|
| 1세대 | 1950–1957 | 최초 상업용 컴퓨터, vacuum tubes, punched card I/O |
| 2세대 | 1957–1965 | transistors, core memory, FORTRAN·COBOL, 직업 programmer 탄생, 최초 OS |
| 3세대 | 1965–1975 | integrated circuit, minicomputer, software industry, time-sharing OS |
| 4세대 | 1975–1985 | LSI/VLSI, microcomputer, computer network, e-mail, GUI |
| 5세대 | 1985– | massively parallel(10¹⁵ ops/s), handheld, 고해상도 그래픽·VR, 무선·유비쿼터스 |
Ariane 5 (첫 수업 이야기)
1996년 Ariane 5 로켓은 64비트 실수 속도 값을 16비트 정수로 변환하다 overflow가 나 발사 37초 만에 폭발했습니다. 알고리즘의 정확성(correctness)과 수의 내부 표현(4장)이 왜 중요한지 보여 주는 사례입니다.
6. 알고리즘 문제 해결 연습
25개 도시를 한 번씩 방문하는 모든 경로를 나열해 최단 경로를 찾으려 한다. 컴퓨터가 1초에 10,000,000개의 경로를 검사할 수 있다면 얼마나 걸리는가? 이 알고리즘은 실용적인가?
정답 확인
경로의 수는 25! ≈ 1.55 × 10²⁵ 개.
1.55 × 10²⁵ / 10⁷ ≈ 1.55 × 10¹⁸ 초 ≈ 약 490억 년
결과는 나오지만(유한 시간) 현실적으로 쓸 수 없다. 이런 문제는 3장의 intractable problem이며, 정답 대신 "가장 가까운 아직 안 간 도시로 가기" 같은 approximation algorithm을 쓴다.
두 양의 정수 a, b의 곱을 반복 덧셈으로 구하는 알고리즘을 의사코드로 쓰시오. (예: 47 × 25 = 47 + 47 + … + 47, 25번)
정답 확인
Get values for a and b
Set product to 0
Set count to 0
While (count < b) do
Set product to product + a
Set count to count + 1
End of loop
Print product
Stop2장 Figure 2.10과 같은 알고리즘이다. a 또는 b가 0이면 루프를 0번 돌고 0을 출력하므로 따로 처리하지 않아도 결과는 맞다.
CD 한 장에는 약 7억(700,000,000) 개의 문자가 들어간다. 이것을 책으로 인쇄하면 책장이 몇 피트 필요한가? (1단어 = 5문자, 1쪽 = 300단어, 1인치 = 300쪽)
정답 확인
700,000,000 / 5 = 140,000,000 단어 → / 300 = 466,667 쪽 → / 300 = 1,555.6 인치 → / 12 ≈ 129.6 피트(약 40 m)
7. 슬라이드 마지막 질문: 트리에서 두 노드 사이의 거리
1
/ \
2 3
/ \ / \
4 5 6 7
\
8Dist(4, 5) = 2, Dist(4, 6) = 4, Dist(3, 4) = 3, Dist(2, 4) = 1, Dist(8, 5) = 5
정리 카드
컴퓨터 과학의 정의(영어)와 네 가지 측면은?
The study of algorithms — formal and mathematical properties, hardware realizations, linguistic realizations, applications.
알고리즘 정의의 다섯 키워드는?
well-ordered, unambiguous, effectively computable, produces a result, halts in a finite amount of time.
primitive operation이란?
computing agent가 더 이상의 설명이나 단순화 없이 바로 이해하고 수행할 수 있는 연산(= unambiguous operation).
LCM을 GCD로 구하는 공식은?
LCM(a, b) = a × b / GCD(a, b). 세 수는 LCM(LCM(a, b), c).
ENIAC과 Mark I의 차이는?
Mark I은 릴레이·기어를 쓴 electromechanical, ENIAC(1946)은 최초의 fully electronic general-purpose programmable computer.
stored program computer를 제안한 사람과 그 첫 구현 중 하나는?
John Von Neumann, EDVAC(1951).
내용을 이해했다면 학습 완료를 체크해 주세요.