[조합론] 4. 점화식(1: 알고리즘, 점화식들의 예)
알고리즘(algorithm)은 주어진 문제를 (컴퓨터를 사용하여) 해결하기 위한 방법을 의미하며 어떤 값 또는 값의 집합을 입력으로 받아 갑 또는 값의 집합을 출력하는 잘 정의도니 절차이다.
다음은 알고리즘의 5가지 특징이다.
(1) 유한성(finiteness): 알고리즘은 유한번 안으로 끝나야 한다.
(2) 명확성(definiteness): 알고리즘의 각 단계는 명확하게 정의되어야 한다.
(3) 입력(input): 알고리즘이 시작되기 위해서는 초기에 어떤 특정한 값을 입력해야 한다.
(4) 출력(output): 알고리즘은 입력과 관계가 있는 몇 개의 출력이 있어야 한다.
(5) 유효성(effectiveness): 알고리즘에서의 모든 작업은 정확해야 하며, 종이와 연필로 유한 시간에 끝낼 수 있어야 한다.
알고리즘에서는 정확성과 효율성 이 두가지를 고려해야 하며, 정확성과 관련해서 고려해야 할 요소는 다음과 같다.
(1) 유한회의 과정을 통해 답을 얻을 수 있어야 한다.
(2) 단계가 분명하게 정의되어 있어야 한다.
(3) 한 단계가 끝나면 다음 단계가 명확해야 한다.
다음은 알고리즘의 예시들이다.
*참고: 다음의 알고리즘은 의사코드(psuedo code)로 작성되었다.
호너의 방법(Horner's method)
호너의 방법은 특정한 x에 대하여 다항식 f(x)=a0xn+a1xn−1+⋯+an−1x+an의 값을 구하는 과정이다.
Procedure poly(x) f_{0}=a_{0} for i=0 to n-1 do f_{i+1}=f_{i}×x+a_{i+1} return f_{n} end poly |
여러개의 수 중에서 큰 수를 찾는 알고리즘
algorithm max(a_{1}, a_{2}, ..., a_{n}) begin max=a_{1} i=2 while i<=n { if max<a_{i} then max=a_{i} i=i+1 } print max end |
n!을 구하는 알고리즘
Procedure factorial(n) if n=0 then return(1) return(n*factorial(n-1)) end factorial |
음이 아닌 두 정수 a와 b에 대하여 두 수의 최대공약수를 구하는 알고리즘(유클리드 알고리즘)
Procedure gcd(a, b) if a<b then swap(a, b) #큰 수로 바꾸기# if b=0 then return(a) r=a mod b #r은 a를 b로 나누었을 때의 나머지# return(gcd(b, r)) end gcd |
순서도(flow chart)는 알고리즘을 그림으로 나타낸 것으로, 해결 과정을 단계적으로 쉽게 파악할 수 있게끔 그림(전개도)으로 나타낸 것이다.
다음은 순서도에 사용되는 기호들이다.
|
시작 또는 끝을 나타내는 기호 |
|
처리 기호 |
|
판단기호 |
|
인쇄기호 |
다음은 순서도의 한 예시이다.
알고리즘의 효율성을 판단하는 기준은 문제를 해결하는데 소요되는 시간이다.
예: 다음은 n개의 수 x1,x2,⋯,xn을 크기순으로 배열하는 두가지 방법이다.
방법 1
1. 다음 알고리즘에 의해 x1,x2,⋯,xn의 최댓값 max{x1,x2,⋯,xn}을 찾는다.
(1) x1과 x2를 비교하여 max{x1,x2}를 찾는다.
(2) max{x1,x2}와 x3을 비교하여 max{x1,x2,x3}을 찾는다.
..........................................
(n-1) max{x1,x2,⋯,xn−1}과 xn을 비교하여 max{x1,x2,⋯,xn}을 찾는다.
2. x1,x2,⋯,xn중 max{x1,x2,⋯,xn}을 제외한 나머지 n-1개의 수를 가지고 1번의 알고리즘을 적용해서 x1,x2,⋯,xn중 두번째로 큰 수를 찾는다.
3. 위 과정을 반복해서 x1,x2,⋯,xn을 크기순으로 나열할 수 있다.
이 경우의 비교회수는 (n−1)+(n−2)+⋯+1=n(n−1)2이다.
방법 2
1. x1,x2,⋯,xn 중 임의로 y를 선택해서 나머지 n−1개의 원소들을 y를 기준으로 y보다 작으면 y의 앞에, y보다 크면 y의 뒤에 두어서 두 개의 집합 X1과 X2로 분리한다.
2. X1과 X2 각각을 1과 같은 방법을 이용하여 크기순으로 나열해 합치면 원하는 배열을 얻을 수 있다.
이 경우의 비교회수는 대부분 방법 1보다 빠른 시간안에 해결가능하나 최악의 경우는 방법 1과 같은 비교회수를 통해 문제가 해결된다.
수열의 n번째 항을 그 이웃한 항이나 그보다 앞선 항들에 대한 관계식으로 나타낼 수 있을 때가 있다.(예: 피보나치 수열 an+2=an+1+an,a1=a2=1) 이러한 관계를 점화관계(recurrence relation)라고 하고 여기의 관계식을 점화식(recurrence formula)이라고 한다. 특별한 경우, 점화식과 초기조건으로부터 일반항 an의 식을 유도할 수 있다.
예: 하노이 탑 문제(Hanoi tower problem)
(하노이 탑 모형)
등판에 막대가 3개 있고, 크기가 서로 다른 n개의 원판이 한 막대에 크기순으로(큰 원판이 작은 원판보다 아래에 놓임) 꽂혀 있다. 이때 다음의 규칙대로 원판을 다른 막대로 옮긴다.
(1) 한 번에 한개의 원판만을 옮긴다.
(2) 크기가 큰 원판은 반드시 크기가 작은 원판 아래쪽에 있어야 한다.
그러면 원판을 모두 다른 막대로 옮기는데 필요한 최소한의 이동 횟수는?
풀이: 원판의 개수가 n일 때, 최소 이동횟수를 an이라 하자. 그러면a1=1,a2=3이고
임의의 n에 대하여, 가장 큰 원판을 처음으로 옮길 때에는, 다른 원판들은 모두 하나의 막대에 크기순으로 배열되어 있어야 한다. 따라서 가장 큰 원판을 옮기기 전까지의 최소 이동횟수는 an−1이다. 가장 큰 원판을 비어있는 다른 원판에 이동한 다음, 나머지 n−1개의 원판을 가장 큰 원판이 놓여 있는 막대로 이동해야 한다. 따라서 an=2an−1+1이 성립하고a3=2a2−1=7=23−1a4=2a3+1=2(23−1)+1=24−1이므로 an=2n−1이다.
(n=4일 때, a4=24−1=15이다)
*참고: 베트남 하노이 시 외곽에 있는 베나레스(Benares) 사원의 한 가운데에 있는 돔(Dome)에 다음의 전설이 기록된 동판이 있다:
"동판에 다이아몬드 막대가 3개 있고, 크기가 서로 다른 64개의 황금 원판이 한 막대에 꽂혀있다. 이때 다음과 같은 규칙으로 황금 원판을 다른 막대로 모두 옮기는 놀이를 신(god, 神)이 하고 있다
(1) 한번에 한개의 황금원판만을 옮긴다.
(2) 크기가 큰 황금원판은 반드시 크기가 작은 황금 원판 아래에 있어야 한다.
신이 이 놀이를 끝내면(황금원판이 다른 막대로 모두 옮겨졌다면), 이 세상은 종말이 올 것이다."
실제로 황금원판 한개를 다른 원판으로 옮기는데 1초가 걸린다고 가정하면, 황금원판이 다른 막대로 모두 옮겨지는데 걸리는 시간은 264−1=18,446,744,073,709,551,615초(대략 5833억년)가 걸린다.(걱정할 필요가 없다)
예: 한 아이가 7개의 계단을 올라간다고 하자. 이때 한번에 하나 또는 두개의 계단을 오를 수가 있다. 이 아이가 7개의 계단을 서로 다르게 오르는 방법의 수는?
풀이: n개의 계단을 오르는 경우의 수를 an이라 하자. 그러면 a1=1,a2=2익, n≥3인 경우, 처음에 한 개의 계단을 오르는 경우, 이 경우의 수는 남아있는 n−1개의 계단을 오르는 방법의 수와 같으므로 an−1가지가 된다. 처음에 두개를 오르는 경우, 남아있는 n−2개의 계단을 오르는 방법의 수와 같으므로 an−2가지가 된다. 따라서 다음의 점화식an=an−1+an−2(a1=1,a2=2,n≥3)을 얻고a7=a6+a5=2a5+a4=3a4+2a3=5a3+3a2=8a2+5a1=16+5=21이다.
참고: 위의 점화식을 갖는 수열을 피보나치 수열(Fibonacci sequence)이라고 한다.
예: 평면상에 n개의 직선이 나누는 영역의 최대 개수(어떤 두 직선도 평행하지 않고, 어떤 세 직선도 한 점에서 만나지 않도록 직선을 그을 때 생기는 영역의 수)는?
풀이: n개의 직선으로 나눌 때 생기는 영역의 최대 개수를 an이라고 하자. 그러면 a1=2이고 n≥2일 때, n번째 직선을 그리면 나머지 n−1개의 직선과 만나는 교점의 수는 n−1개이고, 영역의 수는 n개 더 늘어난다. 따라서 점화식an=an−1+n,a1=2(n≥2)을 얻고 일반항은an=1+n(n+1)2이다.
예: 0,1,2로 이루어진 길이가 n인 3n개의 수열 중 0의 개수가 홀수인 수열의 개수는?
풀이: 길이가 n이고 0의 개수가 홀수인 수열의 개수를 bn이라고 하자.
끝자리가 1인 경우는 bn−1개 이고, 끝자리가 2인 경우는 bn−1개, 끝자리가 0인 경우, 3n−1−bn−1이므로 다음의 점화식을 얻고bn=bn−1+3n−1,b1=1이므로 bn=3n−12이다.
참고자료:
조합론과 그래프이론, 조성진, 김한두, 경문사
https://www.scienceall.com/%EC%88%9C%EC%84%9C%EB%8F%84flow-chart/
https://support.office.com/ko-kr/article/%EA%B8%B0%EB%B3%B8-%EC%88%9C%EC%84%9C%EB%8F%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-e207d975-4a51-4bfa-a356-eeec314bd276
https://en.wikipedia.org/wiki/Tower_of_Hanoi
수학비타민, 박경미, 랜덤하우스 중앙
'확률및통계 > 조합론' 카테고리의 다른 글
[조합론] 6. 점화식(3: 생성함수) (0) | 2019.03.04 |
---|---|
[조합론] 5. 점화식(2: 선형점화식) (0) | 2019.03.03 |
[조합론] 3. 경우의 수 세기(2: 중복순열, 중복조합, 이항계수의 성질) (0) | 2019.03.01 |
[조합론] 2. 경우의 수 세기(1: 순열, 조합) (0) | 2019.02.28 |
[조합론] 1. 조합론의 정의와 여러가지 증명방법 (0) | 2019.02.27 |