반응형

언어 자료구조 알고리즘/[C]디딤돌 자료구조와 알고리즘 39

[디딤돌 자료구조와 알고리즘 with C] 3.2 하노이 타워

3. 2 하노이 타워 재귀 알고리즘 중에 하노이 타워가 있습니다. 하노이 타워 알고리즘은 n 개의 돌을 이동시키는 문제입니다. 세 개의 기둥이 있고 하나의 기둥에 n 개의 돌이 크기 순으로 있습니다. 한 번에 하나의 돌을 이동할 수 있고 작은 돌 위에 큰 돌이 올 수 없습니다. 이와 같은 규칙을 이용하여 n 개의 돌이 있는 기둥에서 다른 기둥으로 모든 돌을 옮기는 문제입니다. [그림 3.1] 하노이 타워 이 문제를 재귀적으로 해결하면 다음과 같은 방법으로 해결할 수 있습니다. 가정: n-1개의 돌을 옮길 수 있다.가정에 의해 먼저 A에 있는 n-1개의 돌을 C를 이용하여 B로 옮깁니다.규칙에 의해 1개의 돌을 A에서 C로 옮깁니다.가정에 의해 B에 있는 n-1개의 돌을 A를 이용하여 C로 옮깁니다.따라서..

[디딤돌 자료구조와 알고리즘 with C] 3. 재귀 알고리즘

3. 재귀 알고리즘 이번에는 재귀 알고리즘을 살펴봅시다. 재귀 알고리즘은 문제를 해결하기 위해 자신의 알고리즘을 이용하여 해결하는 것을 말합니다. 수학에서 특정 명제가 참인지 증명하기 위해 명제를 이용하여 증명하는 방법과 같은 방식입니다. 예를 들어 "n!을 f(n)이라 할 때 n>1인 정수이면 n!은 n*f(n-1)이다."라는 명제를 증명하면 다음과 같이 증명할 수 있습니다. n-1일 때 위 명제가 참이라 가정하자. 가정에 의해 f(n-1) = (n-1)*(n-2)*...*3*2*1 이다.n*f(n-1) = n*(n-1)*(n-2)*...*3*2*1 = n! 이므로 위 명제는 참인 명제이다. 이처럼 자신을 이용하여 문제를 해결하는 방법을 재귀적 귀납법이라 하는데 이와 같은 방법으로 문제를 해결하는 알고..

[디딤돌 자료구조와 알고리즘 with C] 2.4.2 삽입 정렬 알고리즘 구현

2.4.2 삽입 정렬 알고리즘 구현 삽입 정렬 알고리즘을 구현합시다. 시뮬레이션 함수 등은 앞과 같으므로 설명을 생략할게요. void insertion_sort(Element *base, int n, Compare compare){ 두 개의 반복문에서 사용할 변수를 선언하고 교환에 사용할 임시 변수도 선언할게요. int i = 0, j=0; Element temp; 외부 반복문은 정렬할 범위를 넓혀나가는 것입니다. 따라서 i를 1부터 n까지 점진적으로 증가할게요. for(i=1; i0; j--) { 만약 j번째 원소가 앞의 원소보다 크면 자리를 교환합니다. if(compare(base[j-1],base[j])

[디딤돌 자료구조와 알고리즘 with C] 2.4 삽입 정렬 알고리즘

2.4 삽입 정렬 알고리즘 이번에는 반복 알고리즘 중에 삽입 정렬 알고리즘을 알아봅시다. 삽입 정렬 알고리즘은 점진적으로 정렬 범위를 넓혀 나가는 방식으로 정렬하는 알고리즘입니다. 이를 위해 새로운 범위에 포함하는 마지막 원소를 앞으로 이동하면서 자신보다 작은 요소를 찾을 때까지 이동하면서 자리를 교환합니다. 삽입 정렬(base:컬렉션, n:원소 개수, compare:비교 논리) 반복(i:=1; i0 ; j:=j-1) 조건(compare (base [j-1], base [j]) < 0) temp: = base [j-1] base[j-1] = base [j] base[j] = temp 아니면 루프 탈출예:정렬 전: 10 9 2 11 191.1회전: 9 10 2 11 19 (i:1,j:1, 0과 1 교환)2..

[디딤돌 자료구조와 알고리즘 with C] 2.3.2 선택 정렬 알고리즘 구현

2.3.2 선택 정렬 알고리즘 구현 이제 선택 정렬 알고리즘을 구현합시다. void select_sort(Element *base, int n, Compare compare){ 먼저 내부 반복문과 외부 반복문에서 사용할 두 개의 변수를 선언하세요. int i = 0, j=0; 그리고 최대값이 있는 위치를 기억할 변수도 선언합니다. 그리고 교환에서 사용할 임시 변수도 선언하세요. int max=0; Element temp; 외부 반복문에서는 정렬할 범위를 점진적으로 줄여나갑니다. for(i=n; i>1; i--) { 내부 반복문에서는 max를 0으로 초기화하고 j를 1로 초기화합니다. 이는 일단 맨 앞에 있는 요소를 최대값이 있는 위치로 설정하고 그 다음 요소부터 최대값과 비교하기 위해서입니다. 그리고 j..

[디딤돌 C언어 자료구조와 알고리즘] 2.3 선택 정렬 알고리즘

2. 3 선택 정렬 알고리즘 이번에는 반복 알고리즘일 이용하는 선택 정렬 알고리즘을 알아봅시다. 선택 정렬 알고리즘은 제일 큰 값을 찾아 맨 뒤의 요소와 교체하는 방법을 반복하여 전체를 정렬하는 알고리즘입니다. 물론 제일 작은 값을 찾아 맨 앞의 요소와 교체하는 방법을 반복할 수도 있습니다. 선택 정렬 알고리즘을 의사코드(pseudo code: 논리적인 수행 흐름을 이해할 수 있게 작성한 코드)는 다음과 같습니다. 선택 정렬(base:컬렉션,n:원소 개수,compare:비교 논리) 반복(i:=n; i>1 ; i:= i-1) 반복(max=0,j:=1; j

[디딤돌 자료구조와 알고리즘 with C] 2.2.2 버블 정렬 알고리즘 구현

2.2.2 버블 정렬 알고리즘 구현 이번에는 버블 정렬 알고리즘을 구현하는 예를 보여드릴게요. 먼저 공통으로 사용할 파일을 프로젝트 폴더에 복사한 이후에 프로젝트에 추가하세요. 그리고 헤더 파일을 포함합니다. 이후의 작업에서는 언제나 필요하며 별다른 언급을 하지 않겠습니다.#include "Book.h" 여기에서 정의할 버블 정렬은 원소 형식에 관계없이 동적으로 생성한 개체의 집합을 정렬하게 정의할 것입니다. 이를 위해 void * 형식을 Element 형식 이름으로 정의할게요.typedef void *Element;typedef int (*Compare)(Element , Element); 버블 정렬은 n개의 원소가 있는 배열의 주소와 원소 개수 및 비교 알고리즘을 입력 인자로 필요합니다.void bu..

[디딤돌 자료구조와 알고리즘 with C] 2.2.1 버블 정렬 알고리즘 성능 분석

2.2.1 버블 정렬 알고리즘 성능 버블 정렬 알고리즘 성능을 분석합시다. 버블 정렬(base:배열의 시작 주소, n: 원소 개수, compare:비교 논리) 반복(i:=n; i>1 ; i:= i-1) 반복(j:=1; j 0) 교환(base[j-1],base[j]) n 개의 원소인 배열을 정렬할 때 비교에 걸리는 수행 시간을 T'(n)이라고 합시다. 버블 정렬의 내부 반복문에서 비교에 걸리는 시간을 S(n)이라고 하면 S(n)=n-1입니다. 따라서 T'(n)은 다음과 같습니다.T'(n) = S(n) + S(n-1) + ... + S(2) = (n-1) + (n-2) + (n-3) + ... + 3 + 2 + 1 따라서 버블 정렬의 비교에 걸리는 시간은 O(n^2)이라고 말할 수 있습니다. n 개의 원소인..

[디딤돌 자료구조와 알고리즘 with C] 2. 3 버블 정렬 알고리즘

2. 3 버블 정렬 알고리즘 이번에는 반복적인 방법으로 해결하는 버블 정렬 알고리즘을 살펴봅시다. 정렬 알고리즘은 배열의 자료를 원하는 순으로 배치하는 것을 말합니다. 이를 위해 입력 인자로 정렬할 자료들이 있는 배열의 시작 주소와 원소 개수, 비교 알고리즘을 전달합니다. 그리고 수행 후에는 배열 내의 자료들이 원하는 순서로 보관한 상태여야 합니다. 이 중에 버블 정렬은 앞에서부터 이웃하는 원소의 값을 비교하여 위치를 교환하는 것을 반복합니다. 이를 끝까지 수행하면 제일 큰 값이 맨 뒤에 위치합니다. 그리고 정렬할 개수를 1 줄인 후에 다시 반복합니다. 정렬할 원소의 개수가 1이면 모든 작업을 완료합니다. 버블 정렬(base:배열의 시작 주소, n: 원소 개수, compare:비교 논리) 반복(i:=n;..

반응형