Professional Documents
Culture Documents
3단원 (알고리즘)
3단원 (알고리즘)
알고리즘
3
1 관계 기반 알고리즘
문제와 알고리즘 2
탐색 기반 알고리즘
P vs. NP 문제
NP-Hard NP-Hard
NP-Complete vs
P = NP =
NP
NP-Complete
Complexity
P ≠ NP P = NP
지뢰 찾기 문제 해밀턴 경로 문제
190 Ⅲ. 알고리즘
1 문제의 개념
‘문제’란 해결해야 할 과제, 도전이나 해법이 필요한 어떤 상황, 해답을
요구하는 물음
곤란하고 힘든 일, 성가시고 귀찮은 상황 등을 뜻한다. 문제를 해
논쟁, 논의, 연구
결한다는 것은 어떤 목적이나 목표를 달성하기 위한 해법이나
등의 대상이 되는 것
도움을 만들어 낸다는 것이다.
해결하기 어렵거나
수학을 배워서 수학 문제를 해결하고, 과학을 배워서 과학 난처한 대상 또는 그런 일
1 OR 9 •미지수 x 를 구하려면
어떻게 해야 할까?
6 / 2(1 + 2)의 결과는 1일까? 9일까? 2(3)을 먼저 강력한 대포는 더 멀리 쏜다. 포탄을 발사해 지구를
계산하면 1이고, 6 ÷ 2를 먼저 계산하면 9이다. 돌게 할 수 있을까?
▲▲수학 문제 ▲▲과학 문제
01
탐구 활동
2 문제의 종류
컴퓨터와 계산 수학, 과학 등과 마찬가지로 정보과학 분야에서는 컴퓨터를 이용하여 효율적으로 문제
컴퓨터는 더 빠르고 정확한 계
산을 위해 만들어진 도구이다.
를 해결하기 위한 방법을 제시한다. 이러한 컴퓨터의 능력은 빠르고 정확한 계산 능력을
바탕으로 한다. 계산 문제(computational problem)란 컴퓨터의 계산 능력(computing
power, computation)을 이용하여 해결 가능한 문제를 뜻한다.
계산 문제 컴퓨터는 한 번에 하나의 작업만 수행할 수 있으며, 대체로 작업의 단위가 매우 작다.
계산 문제는 산술 연산이나 논
리 연산의 조합을 통해 해결 따라서 컴퓨터로 문제를 해결하기 위해서는 여러 가지 작업을 절차적으로 수행해야 한다.
가능한 문제를 말한다.
이러한 관점에서 계산 문제는 절차적으로 해결할 수 있는 모든 문제라고 정의할 수 있다.
다음의 문제는 계산 문제이다.
1 2 3 1 2 3
4 5 4 5 6
7 8 6 7 8
주어진 숫자판 완성된 숫자판
출발역
도착역
192 Ⅲ. 알고리즘
•현재 지구의 인구는 70억 명을 돌파하였다. 앞으로 10년 후의 인구의 수를 구하여라. 계산할 수 있는 문제와 계산
할 수 없는 문제
10년 후의 인구의 수를 구하
•철수는 현재 지하철에 타고 있다. 같은 객차에 타고 있는 사람들 중 키가 작은 사람은 몇 명
기 위해 컴퓨터를 활용할 수는
인지 구하여라. 있으나 정확한 답을 계산해 낼
수는 없다.
최적화 문제
최적화 문제란 시간, 거리, 넓
Yes 계산으로 해결 No 이, 부피 또는 이익이 최대 또
할 수 있는가?
는 최소가 되게 하는 점이나
값을 찾는 문제를 말한다.
계산 문제
연산 계수
문제 문제
계산 불가능 문제
결정
문제 최적화
문제
▲▲문제의 분류
정리
하기 •문제는 해결해야 할 대상이며, 문제를 해결한다는 것은 목적 달성을 위한 해법을 만들어내는 것이다.
•수학, 과학, 인문·사회학 등 다양한 학문들은 각각이 갖는 특성에 따라 문제 상황을 이해하고, 이를 해결하기
위한 방법을 제시하는 데 의의가 있다.
•정보과학은 논리적 연산과 산술적 연산을 조합하여 절차적으로 해결할 수 있는 계산 문제에 관심을 갖는다.
•계산 문제는 문제 또는 해결 방법의 특성에 따라 단순 연산 문제, 결정 문제, 계수 문제, 최적화 문제 등으로 나
뉜다.
194 Ⅲ. 알고리즘
P 대 NP 문제는 P 문제와 NP 문제가 서로 같음을 증명하라는 것으로서, 미국의 클레이수학연구소(CMI: The Clay
Mathematics Institute)에서 푸는 사람에게 100만 달러의 상금을 주겠다고 하는 7대 난제 중 하나로 유명하다. 이
때 P는 다항식을 뜻하는 영어 단어인 ‘Polynomial’의 약자이며, P 문제는 우리말로 다항 시간 문제(Polynomial time
problem)라고 부른다. 반면, NP는 ‘Non - deterministic Polynomial time problem’의 약자로서 미정 다항 시간 문
제라고 할 수 있다.
P 문제는 문제를 해결하기 위한 알고리즘의 수행 시간을 다항식으로 나타낼 수 있는 문제를 뜻한다. 정렬 문제를 해
결하기 위한 버블, 선택, 삽입, 퀵, 히프 정렬 알고리즘은 리스트를 구성하는 원소의 개수가 n일 때, 수행 시간은 O(n2)
또는 O(nlgn)으로 나타낼 수 있다. 따라서 알고리즘의 수행 시간을 다항식으로 나타낼 수 있으므로 정렬 문제는 P 문
제이다.
반면, NP 문제는 문제를 해결하기 위한 알고리즘의 수행 시간을 다항식으로 나타낼 수 없는 문제를 뜻한다. 대체로
알고리즘의 시간 복잡도가 O(n!) 또는 O(kn) 등인 경우를 말한다. 대표적인 NP 문제로는 ‘해밀턴 경로 문제’, ‘그래프
색칠 문제’, ‘순회 외판원 문제’ 등이 있다.
B
A D
E E
▲▲해밀턴 경로 문제 ▲▲그래프 색칠 문제
▲▲순회 외판원 문제
그렇다면 P와 NP가 같음을 증명하는 것은 어떤 의미일까? 그리고 이것을 해결하는 데 정보과학은 어떤 의미를 가
질까? 이 고민의 시작이 정보과학적 문제 해결의 시작이라고 할 수 있다.
1 알고리즘의 표현
알고리즘 ‘알고리즘’이란 문제를 해결하는 방법을 뜻하는 것으로, 정보과학 분야에서 다루는 계산
알고리즘은 현재 상태에서 목
표 상태로 이르기 위해 수행해
문제를 해결하기 위한 과정을 절차적으로 나열한 것을 의미한다.
야 하는 순서화된 작업의 나열 계산 문제를 해결하는 과정은 상태 변화를 위한 작업을 찾고 이를 수행하는 것이라 할
이다.
수 있다. 이를 위해서 먼저 문제 분석을 통해 현재 상태와 목표 상태를 파악해야 한다. 그
리고 문제 분해를 통해 현재 상태와 목표 상태를 연결해 주는 중간 상태를 찾아야 한다.
현재 상태 목표 상태
상태 상태 상태 상태
1 2 3 n
수행 작업 1 수행 작업 2 수행 작업 3
알고리즘
▲▲알고리즘을 통한 계산 문제 해결 모델
알고리즘의 5가지 특성
1. 유한성: 알고리즘은 유한한 횟수 내에서 종료되어야 한다.
2. 명확성: 알고리즘은 명확하게 정의되어야 한다.
3. 입력: 알고리즘은 0개 이상의 입력을 가진다.
4. 출력: 알고리즘은 1개 이상의 출력을 가진다.
5. 효율성: 알고리즘은 다양한 방식으로 문제를 해결할 수 있다.
196 Ⅲ. 알고리즘
문제의 모델링
•문제: n개의 수를 가진 배열 S에 값 x가 있는가?
문제 분석 결과를 좌측과 같이
•조건: n은 양의 정수 모델링할 수 있다.
•입력: 1에서 n까지의 첨자를 가진 값의 배열 S, 그리고 값 x
•출력: S 안에 x의 위치를 가리키는 위치, S 안에 x가 없으면 0
위의 문제를 해결하는 알고리즘을 프로그래밍 언어를 이용하여 표현하면 다음과 같다. 프로그래밍 언어를 이용한 알
고리즘 표현
프로그래밍 언어를 이용하면 가장 명확하게 표현할 수 있다는 것이 장점이지만, 특정 언 특정 프로그래밍 언어를 모르
는 사람들은 이해하기 어렵다.
어에 종속된다는 것이 단점이다.
if(location > n) location = 0;
printf("%d", location);
}
의사 코드
다음은 의사 코드를 이용하여 알고리즘을 표현한 것이다. 의사 코드는 자연어에 가깝게 의사 코드(pseudo code)는
‘pseudo’라는 단어에서 알 수 있
표현할 수도 있으며, 프로그래밍 언어처럼 표현할 수도 있다. 따라서 명확하게 표현할 수
듯이 ‘가짜 코드’라는 뜻이다.
있으면서 특정 언어에 종속되지 않으므로 알고리즘을 표현할 때 자주 활용된다.
[의사 코드 1]
배열 S [1...n]가 주어졌을 때 이 알고리즘은 주어진 인수 k를 S [ ]에서 찾는다. n ≥1이라고 가정한다.
S1. [초기화] i ← 1로 설정한다.
S2. [비교] 만일 k = S[i]이면 i를 출력하고 알고리즘을 끝낸다. 검색에 성공한 것이다.
S3. [전진] i를 1 증가한다.
S4. [파일의 끝?] 만일 i <= N이면 S2로 돌아간다. 그렇지 않으면 검색 실패로 결과는 0을 출력
하고 알고리즘을 끝낸다.
[의사 코드 2]
void seqsearch(int n, const keytype S[ ], keytype x, index location)
{
location = 1
순서도의 한계 순서도(flowchart)는 논리의 흐름을 주어진 도형을 이용하여 표현하는 방법으로, 순차,
순서도는 복잡한 알고리즘을
반복 등의 구조를 쉽게 표현한다는 점이 장점이다. 하지만 재귀 함수 등의 관계 표현에서
표현하기에는 한계가 있다.
또한 순서도마다 사용하는 기 의 제약이 있다는 단점이 있다.
호의 종류와 의미가 다를 수도
있다. START START START
i= 0 i= 0 i= 0
01
탐구 활동
198 Ⅲ. 알고리즘
2 알고리즘의 복잡도
정렬과 탐색
계산 문제를 해결하기 위한 알고리즘은 문
정렬 또는 탐색 문제를 해결하
제 분해의 결과에 따라 다양하게 작성될 수 는 알고리즘은 매우 많으며, 효
율도 다르다.
있다. 따라서 동일한 문제를 해결하는 여러
문제의 분해
가지 알고리즘이 존재할 수 있으며, 이러한
설악산 매표소에서 대청봉까
알고리즘 간에 효율의 차이가 있을 수 있다. 지 오르는 경로는 어디를 거쳐
가는지에 따라 달라진다. 이는
다양한 알고리즘 중에서 어떤 것이 더 우수
매표소에서 대청봉까지의 경
한가를 가리기 위한 기준이 바로 알고리즘의 로를 어떻게 분해할 것인지와
관련이 있다.
복잡도(complexity)이다. 알고리즘이 복잡하
다는 것은 수행하는 데 오랜 시간 또는 공간이 효율
3 시간 복잡도 계산
기본 연산=단위 연산 알고리즘의 시간 복잡도를 분석하기 위해서는 입력의 크기(n)에 대해서 알고리즘의 기
본 연산이 수행되는 횟수를 비교하여 분석하는 기법을 가장 많이 사용한다.
입력의 크기
정렬 또는 탐색 문제의 경우, 입력 크기
원소의 개수가 입력 크기(n)라
고 할 수 있다.
입력 크기(input size)란 투입된 입력 데이터의 크기를 의미한다. 대부분의 알고리즘에서 입력의 크
기를 재는 기준을 찾기는 어렵지 않다.
알고리즘 시간 복잡도
•입력의 크기: n •기본 연산의 실행 횟수: T(n)
•기본 연산의 종류: k •실제 연산의 실행 횟수: k × T(n)
•연산의 하드웨어적 실행 시간: c •총 실행 시간: c × k × T(n)
200 Ⅲ. 알고리즘
03
탐구 활동
sum(int n, S[ ])
{ Tip
result = 0; 제어에 필요한 명령문을 제외
하고 반복 안에 있는 유일한
명령문은 배열의 수를 더하는
for(i = 1; i <= n; i ++)
명령문으로 배열의 수를 더하
result + = S[i]; 는 명령을 기본 연산으로 정의
} 한다.
Tip
•기본 연산 기본 연산을 무엇으로 선정하
는지에 따라 시간 복잡도가 다
르게 나타날 수 있다.
•입력 크기
•T (n)
•기본 연산
•입력 크기
•T (n)
❶T
(n) 계산
•기본 연산
•입력 크기
•T (n)
202 Ⅲ. 알고리즘
순차 탐색의 입력
순차 탐색의 경우 찾는 값 x가 배열의 첫 번째 수라면 기본 연산은 한 번이 된다. 그러나 값 x가 배
순차 탐색의 경우 리스트의 원
열에 있지 않거나 마지막 번째 수라면 기본 연산은 n번 수행된다. 소의 개수인 입력의 크기 이외
에도 탐색하고자 하는 값을 입
력한다.
이러한 경우에는 입력값에 따른 최악의 경우, 최선의 경우, 평균적인 경우에 대하여 시
간 복잡도 T(n)을 분석해야 한다. 다음은 순차 탐색 알고리즘에 대한 최악, 최선, 평균 시
간 복잡도를 계산하는 과정이다.
(n+1)
여기서 만일 p가 1이면 위에서 살펴본 배열에 x가 존재할 경우와 같이 이 되고 반
2
1 3n 1 3
면에 p가 2 이면 4 + 4이 된다. 이는 평균적으로 4 정도를 기대할 수 있음을 뜻한다.
퀵 정렬
log log
(Quick sort)
히프 정렬
log log log
(Heap sort)
정렬
버블 정렬
(Bubble sort)
삽입 정렬
(Insertion sort)
순차 탐색
(Sequential search)
탐색
2진 탐색
log log
(Binary search)
204 Ⅲ. 알고리즘
정의
O ( g (n)) = { f (n) | 모든 n ≥ n0에 대하여 f (n) ≤ c × g (n)인 양수 c와 n0가 존재한다. }
f (n)
f (n) = O(g(n))
n0 n
▲▲빅오 표기법의 의미
500
450
400
350
1. 문제와 알고리즘 205
300
250
200
150
100
정보과학-3단원-2차.indd 205 2021-12-20 오전 9:46:43
예를 들어, f (n) = n2 + 10n이라고 가정해 보자. 다음의 그래프에서 n이 10 이상인 지점부
터 f (n) 이상의 값을 가지는 함수 2 × g(n)이 존재한다.
500
450
400
350
2n2
300
250 n2 + 10n
200
150
100
500
50
450
0
400 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
100
빅오 표기법을 이용하여 알고리즘의 수행 시간을 분석할 때 주로 사용되는 빅오식은 다
10
음과 같이 그래프로 그려 서로 비교해 볼 수 있다.
1
각 정렬의 시간 복잡도 100000
버블, 삽입, 선택 정렬의 점근 0.1
0.1
10000 1 10 100 1000
시간 복잡도는 O (n2)이다. lgn
퀵 정렬, 히프 정렬의 점근 시 1000 n
간 복잡도는 O (nlgn)이다. nlgn
100
n2
lg 10 n3
n
lg는 밑이 2인 로그를 뜻한다. 2
1 n!
0.1
0.1 1 10 100 1000
▲▲다양한 빅오식
206 Ⅲ. 알고리즘
06
탐구 활동
정리
하기 •알고리즘은 초기 상태를 목표 상태로 전환하기 위해 수행해야 하는 일련의 작업을 나열한 것이다.
•알고리즘은 유한성, 명확성, 입력, 출력, 효율성이라는 조건을 가진다.
•알고리즘은 프로그래밍 언어, 의사 코드, 순서도 등의 도구를 이용하여 명확하게 표현할 수 있다.
•알고리즘의 성능은 계산 복잡도로 나타내며, 계산 복잡도의 종류에는 시간 복잡도와 공간 복잡도가 있다.
•시간 복잡도는 입력의 크기와 기본 연산의 수행 횟수를 이용하여 나타낼 수 있으며, 기본 연산을 어떻게 설정하
느냐에 따라 다르게 나타난다.
•점근 표기법은 시간 복잡도를 다양한 관점에서 분석하기 위해 사용하는 해석학적 기법이다.
•알고리즘의 성능을 다양한 방식으로 분석함에 따라 프로그래밍을 통해 구현하지 않고도 알고리즘의 효율을 비
교 및 분석할 수 있다.
f (n)
cg (n)
n0 n
f (n) =(g(n ))
[정의]
g(n ))={ f (n)|모든
( n ≥n0에 대하여 f (n)≥c ×g(n)인 양수 c와 n0가 존재한다.}
[예시]
3n2 ∈ (n2), 5n3 + 7 ∈ (n2)
c2g (n)
f (n)
c1g (n)
n0 n
f (n ) = (g(n ))
[정의]
(g(n)) = { f (n) | 모든 n≥n0에 대하여 c1×g(n) ≤ f (n) ≤ c2×g(n)인 양수 c1, c2, n0가 존재한다.}
즉, (g (n)) = O( g(n))∩(g (n))이다.
[예시]
3n2 - 2n ∈ (n2)
208 Ⅲ. 알고리즘
3차원 탐색 공간
3차원으로 표현된 탐색 공간
210 Ⅲ. 알고리즘
1 탐색 기반 알고리즘의 개념
‘탐색 기반 알고리즘’이란 컴퓨팅 시스템의 탐색 능력을 기반으로 문제 해결을 위한 해
를 찾는 알고리즘을 뜻한다. 또한 이러한 알고리즘을 효율적으로 설계하기 위한 방법을
탐색 기반 알고리즘 설계 방법이라고 한다.
탐색을 통해 문제를 해결한다는 것은 선형 자료 구조인 배열 또는 리스트 등에서 원하
는 자료를 찾거나, DB 등에서 사용자가 원하는 자료를 찾기 위해 검색하는 것을 예로 들
수 있다. 또한 비선형 자료 구조인 트리 또는 그래프 등에서 원하는 자료를 찾는 행위, 또
는 주어진 문제를 해결하는 과정 중 문제 공간에서 해를 찾는 것도 이에 포함된다. 그리고
탐색한 해의 개수를 세는 계수(counting) 문제, 탐색한 해 중 가장 품질이 좋은 해를 찾는 최적해 탐색 문제
최적화 문제를 최적해 탐색 문
최적화(optimization) 문제 등도 이에 포함할 수 있다. 제라고도 한다.
2 탐색 기반 알고리즘 설계 방법
효율적인 탐색 기반 알고리즘을 설계하는 첫 번째 과정은 먼저 해가 존재할 수 있는 집 탐색 공간
탐색 공간이란 후보 해들의 집
합을 설정하는 것이다. 이러한 집합은 탐색의 대상이 되므로 탐색 공간이라고 부른다. 효 합을 뜻한다.
2. 탐색 기반 알고리즘 211
탐색 공간의 구조 탐색 방법 탐색 알고리즘
순차 탐색
선형 구조 선형 탐색
2진 탐색
깊이 우선 탐색
비선형 구조 비선형 탐색
너비 우선 탐색
212 Ⅲ. 알고리즘
탐색 대상 탐색 기반 알고리즘
탐색 공간의 전체 전체 탐색
탐색 공간의 일부 부분 탐색
01
탐구 활동
정리
하기 •탐색 기반 알고리즘 설계 방법은 효율적인 탐색 알고리즘을 설계하기 위한 것이다.
•탐색 알고리즘은 컴퓨터의 빠르고 정확한 계산 능력을 기반으로 한다.
•탐색 기반 알고리즘을 설계하기 위해서는 효율적인 자료 구조를 설계하고, 탐색 공간의 크기를 줄이는 것이 필
요하다.
2. 탐색 기반 알고리즘 213
1 전체 탐색 알고리즘 설계 방법
알고리즘과 알고리즘 설계 방법 ‘전체 탐색 알고리즘 설계 방법’이란 해가 존재할 수 있는 전체 공간을 모두 탐색하면서
알고리즘 설계 방법과 알고리
해를 찾는 알고리즘을 설계하는 방법으로서, 완전 탐색법 또는 전 탐색법 등으로 불린다.
즘은 다른 의미이다.
알고리즘을 설계하기 쉬운 반면, 탐색 시간이 오래 걸리는 경우 합리적인 시간 내에 해를
찾지 못할 수도 있다는 단점이 있다.
문제 공간
탐색 공간을 문제 공간이라고
부르기도 한다.
214 Ⅲ. 알고리즘
y
3
2 y = log7x
y = log3x
1
0 1 2 3 4 5 6 7 x
<출처 > 대학수학능력시험 9월 모의 평가, 2012년
01
탐구 활동
❶ 주어진 문제 상황
❷ 적용했던 탐색 알고리즘
❸ 문제 해결 여부와 탐색 공간의 크기 간의 관계
2 선형 전체 탐색
탐색 기반 알고리즘을 설계하기 위해서 가장 먼저 할 일은 탐색 공간을 구조화하여 표현
하는 일이다. 이렇게 해야만 탐색의 정확성과 신속성을 높일 수 있는 효율적인 알고리즘
을 설계할 수 있기 때문이다.
2. 탐색 기반 알고리즘 215
216 Ⅲ. 알고리즘
{ 1, 2, 5, 10 }
마지막으로 탐색 결과를 통해 남겨진 원소들의 합을 계산함으로써 다음과 같이 문제를
해결할 수 있다.
1 + 2 + 5 + 10 = 18
따라서 문제의 해는 18이다. 이렇게 절차적으로 접근하여 문제를 해결하면 컴퓨터가 없
어도 쉽게 해를 구할 수 있다. 만약 탐색 공간의 크기가 커진다면 똑같은 절차로 컴퓨터를
활용하여 쉽게 구할 수 있다.
또한 위의 문제 해결 과정에서 입력받는 값을 n으로 일반화하면 다음과 같은 알고리즘
을 설계할 수 있다.
해보기 1 n의 모든 약수의 합
프로그램
01 #include <stdio.h >
02 int main( )
03 {
04 int n, i, sum = 0;
05 scanf("%d", &n);
06
07 for(i = 1; i <= n ; i ++)
08 if(n%i == 0) sum + = i;
09
10 printf("%d\n", sum);
11 }
2. 탐색 기반 알고리즘 217
218 Ⅲ. 알고리즘
4 4 3 3 5
3
3 4
1
2. 탐색 기반 알고리즘 219
b c b c
d e f g d e f g
h i j k h i j k
▲▲깊이 우선 탐색 ▲▲너비 우선 탐색
220 Ⅲ. 알고리즘
2 2
▲▲깊이 우선 탐색의 방문 순서
▲▲백트랙
입력 출력 설명
1. (1, 1, 1)
2. (1, 2)
3 4
3. (2, 1)
4. (3)
2. 탐색 기반 알고리즘 221
▲▲n이 3일 때의 예
3
1
2 3
2 1 0
▲▲레벨 1과 레벨 2의 모습
222 Ⅲ. 알고리즘
BT(n)
if n <= 0
2진 트리 형태의 탐색 공
if n = 0
간을 도식화하고, 이를 백
sum ← sum + 1 트래킹으로 탐색하려면
end if 어떻게 해야 할까?
backtrack
for i ← 1 to n step 1
dfs(n - i)
end for
end BT
print sum
프로그램
01 #include <stdio.h >
02 int sum;
03
04 void f(int n)
05 {
06 int i;
07 if(n <= 0)
08 {
09 if(n == 0) sum ++;
10 return; // backtrack
11 }
12 for(i = 1; i <= n; i ++)
2. 탐색 기반 알고리즘 223
04
탐구 활동
153
247
535
224 Ⅲ. 알고리즘
05
탐구 활동
2. 탐색 기반 알고리즘 225
정리
하기 •전체 탐색 알고리즘 설계 기법은 탐색 공간 전체를 탐색하면서 해를 찾는 알고리즘을 만드는 방법이다.
•전체 탐색 알고리즘은 탐색 공간의 구조에 따라 선형 전체 탐색과 비선형 전체 탐색으로 나뉜다.
226 Ⅲ. 알고리즘
1 탐색 공간의 배제
탐색 알고리즘은 해가 존재할 수 있는 공간을 모두 탐색하면서 해를 찾는 알고리즘으로, 탐색 알고리즘의 효율
탐색 알고리즘의 효율은 탐색
컴퓨터의 빠르고 정확한 계산 능력에 의존하는 알고리즘 설계 방법이다. 따라서 탐색 알 공간의 크기에 영향을 받는다.
2. 탐색 기반 알고리즘 227
01
탐구 활동
❶ 문제 상황
228 Ⅲ. 알고리즘
2 탐욕 알고리즘 설계 방법
전체 탐색 공간 중 일부를 배제하여 효율적으로 문제를 해결하는 방법 중 하나는 탐욕
알고리즘을 설계하는 것이다. 탐욕 알고리즘(greedy algorithm)이란 현재 상태에서 다
음 상태를 탐색할 때 모든 상태를 고려하지 않고, 최선의 상태만을 고려하여 선택하는 알
고리즘 설계 방법으로 욕심쟁이 알고리즘 또는 그리디 알고리즘이라고 불린다. 이 방법은
탐색 공간 상에 여러 개의 해가 존재할 때 이들 중에 가장 적절한 해를 찾는 최적화 문제 최적화 문제와 탐색
최적화 문제의 경우, 가능한 경
를 해결할 때 유용하게 적용할 수 있다. 우를 모두 탐색하는 방법 이외
에도 그리디 알고리즘으로 해
결할 수도 있다.
2. 탐색 기반 알고리즘 229
8 2
4 3 9
1 5 2 1
8 2
4 3 9
1 5 2 1
230 Ⅲ. 알고리즘
8 2
4 3 9
1 5 2 8
$4 12kg
$2 2kg
$2 1kg 15kg
$1
1kg
$10
4kg
2. 탐색 기반 알고리즘 231
1부터 n까지의 선형 탐색
공간을 모두 탐색할 필요
가 있을까?
03
탐구 활동
◯◯ 나라에서 사용하는 동전은 1원, 5원, 10원, 50원으로 구성되어 있다. ◯◯ 나라의
자동판매기에는 다음과 같이 거스름돈을 지불하기 위한 탐욕 알고리즘이 설계되어 있다
고 할 때, 다음에 대해 토론하고 발표해 보자.
232 Ⅲ. 알고리즘
2. 탐색 기반 알고리즘 233
1 1
2 10 2 5
3 9 11 3 9 6
4 7 4 7
5 6 8 5 6 8
▲▲분기한정을 위한 백트랙
234 Ⅲ. 알고리즘
◯◯ 나라에서 사용하는 동전은 10원, 50원, 60원, 100원, 500원으로 구성되어 있다.
◯◯ 나라에서 790원의 거스름돈을 지불할 수 있는 최소 동전의 개수를 구해 보자.
정리
하기 •전체 탐색 알고리즘의 효율을 높이기 위해서는 불필요한 공간을 탐색에서 배제해야 한다.
•탐색 공간의 일부를 탐색함으로써 전체 탐색의 효과를 내는 알고리즘을 부분 탐색 알고리즘이라고 한다.
•현재 상태에서 가장 이득이 되는 다음 상태만을 고려하는 방법을 탐욕 알고리즘이라고 한다.
•탐욕 알고리즘은 최적해를 보장하지 못한다.
•전체 탐색의 과정에서 얻은 정보를 바탕으로 불필요한 영역의 탐색을 제한하는 방법을 분기한정 알고리즘이라
고 한다.
•분기한정 알고리즘은 정확한 근거를 가지고 수행되므로 언제나 최적해를 보장한다.
2. 탐색 기반 알고리즘 235
알고리즘이란 문제를 해결하는 방법과 절차이다. 따라서 문제 해결을 위해 설계한 알고리즘은 주어진 문제 상황에
서 반드시 문제를 해결할 수 있어야 한다.
그러나 문제의 특성상 알고리즘을 설계하더라도 해결이 어려운 문제가 있다. 대체로 시간 및 공간의 제약 때문이
다. 즉, 알고리즘의 시간 복잡도와 공간 복잡도가 좋지 않기 때문이다. 이는 컴퓨터를 이용하여 계산할 때도 마찬가지
이다.
따라서 이러한 문제들을 위한 새로운 접근이 필요하다. 휴리스틱(heuristic)이란 발견법이라는 뜻으로, 합리적인 시
간 및 공간 내에서 해결이 불가능한 문제들을 해결하는 데 활용되는 방법이다. 매우 거대한 탐색 공간을 가진 최적해
탐색 문제를 해결하는 과정에서 대체로 해에 가까울 것이라 예상되는 해를 빠르게 찾기 위한 방법이 대표적인 예이다.
Selection Expansion Simulation Backpropagation
7/10 5/8 0/3 7/10 5/8 0/3 7/10 5/8 0/3 7/11 5/8 0/3
2/4 5/6 1/2 2/3 2/3 2/4 5/6 1/2 2/3 2/3 2/4 5/6 1/2 2/3 2/3 2/4 5/7 1/2 2/3 2/3
0·1
▲▲몬테카를로 트리 탐색
이러한 관점에서 “명확한 근거는 없지만 대략 그럴 것이다.”라는 근거로 수행되는 탐욕 알고리즘도 일종의 휴리스틱
이라고 할 수 있다. 알파고(AlphaGo)에 적용된 몬테카를로 탐색법이나 8-퍼즐 문제를 해결하는 데 활용하는 A* 탐
색 알고리즘 등도 휴리스틱의 한 예이다.
2 8 3 1 2 3 f (n)
1 6 4 8 4 g (n)
7 5 7 6 5 h (n)
( 4= 0+4 ) 목표 노드
2 8 3 2 8 3 2 8 3
1 6 4 1 4 1 6 4
7 5 7 6 5 7 5
( 6= 1+5 ) ( 4= 1+3 ) ( 6= 1+5 )
2 8 3 2 3 2 8 3
…
236 Ⅲ. 알고리즘
1 과제 1 일상생활 속에서 전체 탐색을 통해 해결해야 하는 문제 상황을 발견해 보고, 탐색 공간의 크기를 분석
해 보자.
ctx.translate(200, 360);
branch(0);
function branch(angle)
{
generation ++;
ctx.save( );
ctx.rotate(angle);
ctx.scale(0.85,0.85);
ctx.beginPath( );
ctx.moveTo(0, 0);
ctx.translate(0, -branchLength);
ctx.lineTo(0, 0);
ctx.stroke( );
branch( 0.3);
branch(-0.3);
}
ctx.restore( );
generation--;
238 Ⅲ. 알고리즘
1 문제 분해와 관계
일상생활이나 다양한 학문 분야의 문제를 해결하기 위해서는 문제를 해결하는 방법을
알아야 한다. 그러나 때로는 문제를 해결하는 방법을 알고 있음에도 불구하고 해결하지
못하는 문제가 있다. 이러한 문제들은 우리 주변에서 쉽게 발견할 수 있다.
현재 상태 목표 상태
g (1) g (n)
3. 관계 기반 알고리즘 239
f (1) = 1
f (2) = f (1) × 2
f (3) = f (2) × 3
f (4) = f (3) × 4
▲▲전체 문제와 부분 문제의 관계
f (1) = 1
f (2) = f (1)×2
f (3) = f (2)×3
f (4) = f (3)×4
...
240 Ⅲ. 알고리즘
01
탐구 활동
3. 관계 기반 알고리즘 241
242 Ⅲ. 알고리즘
정리
하기 •전체 문제는 부분 문제로 분해하여 해결한다.
•전체 문제를 구성하는 부분 문제들의 구조를 관계라고 한다.
•계산 문제의 관계는 계산 가능한 형태로 명확하게 표현되어야 한다.
•재귀적 관계란 전체 문제의 해결 구조와 부분 문제의 해결 구조가 동일한 형태일 때의 관계를 뜻한다.
•재귀적 관계로 표현된 문제는 알고리즘 설계 및 구현이 효율적이다.
3. 관계 기반 알고리즘 243
A0 A1
A2
244 Ⅲ. 알고리즘
3. 관계 기반 알고리즘 245
f (1)= 1
분해 이렇게 되면 이 문제는 현재 상태인 f (1)에서 목표 상태인 f (n)으로 나아가기 위한 문제
문제를 보다 쉽게 해결할 수
있는 작은 문제를 나눔
가 된다. 이 사이에는 다양한 상태들이 존재하는데, 이들 간의 재귀적 관계를 정의하기 위
해서는 문제를 동일한 크기로 분할해야 한다.
분할
큰 문제를 동일한 구조의 작은 현재 상태 목표 상태
문제로 나눔
f (1) f (n)
정복
f (1) f (2) f (3) f (n - 1) f (n)
분할된 문제의 해를 얻음
▲▲현재 상태와 목표 상태
이렇게 동일한 크기로 문제를 분할하면 어떠한 k 에 대해서도 다음의 관계식이 성립함
을 알 수 있다.
f (k)= f (k -1)+k
이상의 과정을 정리하면 다음과 같은 점화식을 얻을 수 있다.
(n = 1)
{ f (n -1)+n (n ≠1)
1
f (n)=
246 Ⅲ. 알고리즘
01
탐구 활동
3. 관계 기반 알고리즘 247
02
탐구 활동
*
**
***
248 Ⅲ. 알고리즘
2 하향식 동적 계획법
‘동적 계획법(dynamic programming)’이란, 전체 문제와 부분 문제의 관계를 바탕으 동적 계획법
니들만-분쉬(N e e d l e m a n
로 재귀적으로 정의된 문제를 해결한 결과를 일일이 기록하는 과정을 통해 문제를 해결하 -Wunsch) 알고리즘은 인간의
유전체 지도를 만들기 위한 인
는 알고리즘의 설계 방법이다. 이러한 기록을 위해서 별도의 메모리 공간을 필요로 하며,
간 게놈 프로젝트에 활용된 대
일반적으로 배열을 이용한다. match = 1 mismatch = 1 gap = 1 표적인 동적 계획법 알고리즘
이다.
이렇게 사용하는 배열 공간의 G C A T G C U
값은 문제의 해결, 즉 정복 과정 0 –1 –2 –3 –4 –5 –6 –7
에서 지속적으로 갱신되기 때문
G –1 1 0 –1 –2 –3 –4 –5
에 동적 테이블(dynamic table)
A –2 0 0 1 0 –1 –2 –3
이라고도 부른다. 따라서 동적
T –3 –1 –1 0 2 1 0 –1
계획법은 재귀적 관계로 정의된
T –4 –2 –2 –1 1 1 0 –1
문제의 해결을 위해 동적 테이블
A –5 –3 –3 –1 0 0 0 –1
을 이용하는 방식이라고 할 수
C –6 –4 –2 –2 –1 –1 1 0
있다.
동적 계획법은 문제를 해결하 A –7 –5 –3 –1 –2 –2 0 0
3. 관계 기반 알고리즘 249
(n = 1, 2)
{ f (n -1)+f (n -2) (n ≥3)
1
f (n)=
250 Ⅲ. 알고리즘
프로그램
01 #include <stdio.h >
02
03 int f(int n)
04 {
05 if(n == 1 || n == 2)
06 return 1;
07 else
08 return f(n - 1) + f(n - 2);
09 }
10
11 int main( )
12 {
13 int n;
14 scanf("%d", &n);
15 printf("%d\n", f(n));
16 }
재귀 호출 횟수와 계산 횟수는
▲▲재귀 호출 및 반환 과정 비례한다.
해결하기에 적합한 문제가 아니다.
조금 더 자세한 분석을 위해 입력값 n을 1부터 40까지 증가시킴에 따라 요구되는 계산
횟수를 세어 보고, 그 결과를 파일 출력을 바탕으로 시각화하면 다음과 같은 결과를 얻을
수 있다.
3. 관계 기반 알고리즘 251
프로그램
01 #include <stdio.h >
02 int count;
얼마나 많은 중복 계산이
03
발생할까?
04 int f(int n)
05 {
06 count ++;
07 if(n == 1 || n == 2)
08 return 1;
09 else
10 return f(n - 1) + f(n - 2);
11 }
12
13 int main( )
텍스트 파일(out.txt) 내부 14 {
의 데이터를 그래프를 나 15 FILE *fp = fopen("out.txt", "w");
타낼 수 있는 응용 프로그
16 int n;
램을 이용하여 시각화하
면 어떻게 될까?
17 for(n = 1; n <= 40; n ++)
18 {
19 count = 0;
20 fprintf(fp, "%d %d %d\n", n, count, f(n));
21 }
22 fclose(fp);
23 }
▲▲중복 계산에 따른 재귀 호출 횟수 분석
1 4 7 10 13 16 19 22 25 28 31 34 37 40
시각화를 통해 분석한 결과 중복 계산의 발생이 분할정복 알고리즘의 시간 복잡도를
O(2n)까지 증가시킨 것을 알 수 있다. 따라서 n이 커지면 커질수록 수행 시간이 기하급수
적으로 증가하게 된 것이다. 따라서 컴퓨터를 이용하더라도 합리적인 시간 내에 해를 얻
을 수 없는 상황이 발생한다.
이러한 문제를 해결하기 위해 하향식 동적 계획법, 즉 메모이제이션 알고리즘을 적용해
252 Ⅲ. 알고리즘
f(n)
if memo[n] ≠ 0
f(n) ← memo[n]
else if n = 1 or n = 2
memo[n] ← 1
f(n) ← memo[n]
else
memo[n] ← f(n - 1) + f(n - 2)
f(n) ← memo[n]
end if
end f
3. 관계 기반 알고리즘 253
프로그램
01 #include <stdio.h >
02 long long count, memo[100000];
03
04 long long f(int n)
05 {
06 count ++;
07 if(memo[n] ! = 0)
08 return memo[n];
09 else if(n == 1 || n == 2)
10 return memo[n] = 1;
11 else
12 return memo[n] = f(n - 1) + f(n - 2);
13
14 }
15
16 int main( )
17 {
18 FILE *fp = fopen("out.txt", "w");
19 int n, m;
Tip 20
n값이 바뀌면 배열 memo[ ]의 21 for(n = 1; n <= 100; n ++)
값을 모두 초기화해야 한다. 22 {
23 for(m = 1; m < n; m ++)
24 memo[m] = 0;
25
26 count = 0;
27 fprintf(fp, "%d %lld %lld\n", n, count, f(n));
28 }
29
254 Ⅲ. 알고리즘
200
180
160
140
120
100
80
60
40
20
0
1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96
▲▲하향식 동적 계획법을 적용한 후의 재귀 호출 횟수 분석
03
탐구 활동
3. 관계 기반 알고리즘 255
3 상향식 동적 계획법
상향식 동적 계획법은 재귀 함수를 이용하지 않고, 분할정복 및 메모이제이션 알고리즘을
모두 적용할 수 있는 알고리즘 설계 방법이다. 따라서 메모이제이션을 사용할 때의 계산 효
율은 유지하면서도, 함수의 재귀 호출 과정에서 발생하는 시간의 낭비를 막을 수 있다.
상향식 동적 계획법은 분할정복이나 하향식 동적 계획법과 마찬가지로 전체 문제와 부
256 Ⅲ. 알고리즘
프로그램
01 #include <stdio.h >
02 long long dt[100000];
03
04 int main( )
05 {
06 int n, i;
3. 관계 기반 알고리즘 257
258 Ⅲ. 알고리즘
프로그램
01 #include <stdio.h >
02
03 int main( )
04 {
05 long long d1 = 1, d2 = 1, d3;
06 int n, i;
07 scanf("%d", &n);
08
09 for(i = 3; i <= n; i ++)
10 {
11 d3 = d2 + d1;
12 d1 = d2;
13 d2 = d3;
14 }
15
16 printf("%lld\n", d3);
17 }
04
탐구 활동
3. 관계 기반 알고리즘 259
◯◯ 나라에서 사용하는 동전은 10원, 50원, 60원, 500원으로 구성되어 있다. 입력받은
금액 n원을 동전으로만 거슬러 주기 위해 필요한 최소 동전의 개수를 구해 보자.(단, n원
은 10원 단위로 입력해야 한다.)
정리
하기 •전체 문제와 부분 문제의 재귀적 관계를 바탕으로 분할정복 알고리즘을 설계할 수 있다.
•분할정복 알고리즘은 중복 계산의 문제가 발생할 수 있다.
•동적 계획법은 동적 테이블을 이용하여 이전 문제의 계산 결과를 기록하는 방식으로 설계한다.
•하향식 동적 계획법은 분할정복 알고리즘의 중복 계산 문제를 해결하기 위해 이전의 계산 여부를 기록하는 알고
리즘 설계 방법이다.
•상향식 동적 계획법은 반복문과 추가 메모리의 활용을 통해 시간 복잡도와 공간 복잡도를 향상시키는 효율적인
알고리즘 설계 방법이다.
260 Ⅲ. 알고리즘
3. 관계 기반 알고리즘 261
니들만-분쉬 알고리즘은 두 개의 염기 서열을 x축과 y축의 이름으로 배치한 후 생성되는 2차원 테이블에 대한
초기화, 점수 계산, 되추적의 3가지 과정으로 구현될 수 있다. 초기화는 생성한 테이블의 1행과 1열 전체를 0으
로 정하는 작업이며, 점수 계산은 다음과 같은 알고리즘을 거친다. 단, 여기에서 MAX[A,B,C]는 A,B,C 중 최
댓값을 의미한다. 다음은 이 과정을 자연어로 기술하고 도식화한 것이다.
A G G T C G A G G T C G A G G T C G
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A 0 A 0 2 A 0 2 0 -1 -1 -1 -1
T 0 T 0 T 0 0 1 -1 1 -1 -2
G 0 G 0 G 0 -1 2 3 1 0 1
C 0 C 0 C 0 -1 0 1 2 3 1
C 0 C 0 C 0 -1 -2 -1 0 4 2
C 0 C 0 C 0 -1 -2 -3 -2 2 3
A G G T C G
0 0 0 0 0 0 0
A 0 2 0 -1 -1 -1 -1
T 0 0 1 -1 1 -1 -2 A G G T C G
| | |
G 0 -1 2 3 1 0 1
A T G C C C
C 0 -1 0 1 2 3 1
C 0 -1 -2 -1 0 4 2
∴ A -G -C -
C 0 -1 -2 -3 -2 2 3
▲▲되추적 ▲▲공통 염기 서열
262 Ⅲ. 알고리즘
2 과제 2 생성된 샘플 2개의 공통 염기 서열, 유사도(%) 및 알고리즘 수행 시간을 텍스트 파일(*.txt)로 출력하는
프로그램을 작성해 보자.
문제의 개념
문제의 개념과 종류
계산, 결정, 계수, 최적화
탐색 기반 알고리즘의 개념
탐색 기반 알고리즘 설계
탐색 기반 알고리즘 설계 방법
전체 탐색 알고리즘 설계 방법
알고리즘 탐색 기반 알고리즘 전체 탐색 선형 전체 탐색
비선형 전체 탐색
탐색 공간의 배제란?
탐색 공간의 배제 탐욕 알고리즘 설계 방법
분기한정 알고리즘 설계 방법
문제 분해와 관계
관계 기반 알고리즘 설계
재귀적 관계와 점화식
관계 기반 알고리즘
관계식을 이용한 알고리즘 설계
동적 계획법 하향식 동적 계획법
상향식 동적 계획법
1문 제의 개념과 종류 정보과학에서 다루어지는 문제들은 크게 계산 문제, 결정 문제, 계수 문제, 최적화 문제로 나눌 수 있다.
2 알고리즘의
표현과 분석 알고리즘은 다양한 형태로 표현될 수 있으며, 명확하게 표현하는 것이 중요하다. 또한 알고리즘의 성능은 계산 문제의
해결에 필요한 수행 시간 및 사용 공간의 관점에서 분석이 가능하며, 특히 수행 시간의 관점에서 입력 크기에 따른 최악, 평균, 최선의 경우의 수
행 시간을 근사적으로 나타낸 것을 시간 복잡도의 점근 표기법이라고 한다.
3 탐색
기반 알고리즘 설계 탐색 기반 알고리즘은 가능한 경우들에 대해 탐색해 원하는 결과를 얻어 내는 방법이다. 또한 탐색 공간의 일부를
배제함으로써 탐색의 효율을 높이는 알고리즘을 설계할 수 있다.
4 전체
탐색 전체 탐색은 해가 존재할 수 있는 탐색 공간 전체를 탐색하면서 원하는 해를 찾아가는 방법이다. 탐색 공간의 형태에 따라 선형
전체 탐색과 비선형 전체 탐색으로 구분한다.
5 탐색
공간의 배제 탐색해야 할 문제 공간의 크기를 줄임으로써 알고리즘의 효율을 높이기 위해 탐욕 기법, 분기한정 기법을 사용할 수 있다.
6 관계
기반 알고리즘 설계 관계란 전체 문제와 부분 문제 간의 결합 구조를 뜻하며, 주어진 문제와 그것의 부분 문제 간의 관계를 재귀적으로
정의할 수 있다면 분할정복 알고리즘을 통해 문제를 해결할 수 있다.
7 동적
계획법 분할정복 알고리즘의 계산 중복 문제를 해결하기 위해 계산 여부를 확인하는 방식의 하향식 동적 계획법을 설계할 수 있다. 또
한 동적 계획법의 진행 방향을 상향식으로 설계하면 재귀 호출에 따른 시간 소모를 줄일 수 있다.
264 Ⅲ. 알고리즘
② 입력값 n에 대해서 f( ), g( )의 시간 복잡도를 빅오 표기법으 ② 다음과 같은 규칙을 새롭게 추가하고자 한다. 이를 해결하기 위
대단원 평가 문제 265