1학년 / 1학기 / 전산학개론 / 1강

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다음에 무엇을 할지 순서가 분명"아무 단계나 먼저 하세요"
Unambiguouscomputing agent가 추가 설명 없이 이해 (= primitive operation)"Go back and do it again"(무엇을?), "Start over"(어디서부터?)
Effectively computable이해할 뿐 아니라 실제로 수행 가능"가장 큰 소수를 출력하라", 0으로 나누기, 음수의 실수 제곱근
Produces a result & halts유한 번의 연산 후 결과를 내고 끝남infinite loop (무한 반복)

알고리즘은 세 종류의 연산만으로 만들어집니다.

연산영어예
순차SequentialSet the value of carry to 0
조건ConditionalIf cᵢ ≥ 10 then …
반복IterativeWhile 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하지 않은 경우 두 가지를 쓰시오.

정답 확인
  1. a = 0 → 0으로 나누기
  2. 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 Napierlogarithms 발명 → 곱셈을 덧셈으로 단순화
Slide rule1622년경 첫 계산자
Blaise Pascal — Pascaline초기 mechanical calculator. 톱니가 10칸 돌면 다음 자리로 carry를 넘기는 장치 (7 + 4 = 11)
Gottfried Leibnitz — Leibnitz's Wheel사칙연산 기계식 계산기
Charles Babbage — Difference Engine6자리 사칙연산, 다항식 계산
Babbage — Analytic Engine현대 컴퓨터와 놀랍도록 비슷한 설계 (실제로 완성 못 함)
Herman Hollerithpunched card 집계 기계 → Computer Tabulating Recording Company → 1924년 IBM

컴퓨터의 탄생 (1940–1950)

기계특징
Mark I범용, electromechanical(릴레이·자석·기어)
ENIAC (1946)최초의 fully electronic general-purpose programmable computer
John Von Neumannstored program computer 제안 → 프로그램도 데이터처럼 메모리에 저장
EDVAC (1951)펜실베이니아 대학의 초기 stored program 컴퓨터

현대 (1950~): 세대 구분

세대기간핵심 키워드
1세대1950–1957최초 상업용 컴퓨터, vacuum tubes, punched card I/O
2세대1957–1965transistors, core memory, FORTRAN·COBOL, 직업 programmer 탄생, 최초 OS
3세대1965–1975integrated circuit, minicomputer, software industry, time-sharing OS
4세대1975–1985LSI/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
Stop

2장 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
               \
                8

Dist(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).

오늘도 한 걸음 앞으로.

내용을 이해했다면 학습 완료를 체크해 주세요.

학습 기록은 현재 브라우저에 저장됩니다.
HJS / STUDY한지석