반응형

분류 전체보기 2946

10. 2 순열 문제 [디딤돌 자료구조와 알고리즘 with C++]

10. 2 순열 문제 바구니에 있는 여러 개의 공을 꺼내는 순서의 조합을 찾는 것은 대표적인 순열 문제입니다. 그리고 확률과 통계를 얘기할 때도 순열 문제는 자주 등장합니다. 바구니에서 공을 꺼내는 문제에서는 바구니에 남아있는 공과 꺼낸 공의 조합이 경험정보입니다. 이러한 경험 정보를 스택을 이용하여 동적 알고리즘으로 해결하면 어렵지 않게 문제를 해결할 수 있습니다. 다음은 이처럼 여러 단계로 나누어 문제를 해결하고 이전 단계에서 다음 단계로 진행할 수 있는 모든 경우의 수를 경험하는 방법으로 해결하는 동적 프로그래밍의 의사 코드입니다.초기 경험 정보를 생성스택에 보관반복(스택이 비어 있지 않다면) 스택에서 경험 정보 꺼내옮 스택에서 꺼내온 경험 정보에서 다음 경험 목록 조사 반복(다음 경험 목록을 순차..

10.1 피보나치 수열 [디딤돌 자료구조와 알고리즘 with C++]

10.1 피보나치 수열 피보나치 수열은 재귀적인 방법으로 해결하는 대표적인 알고리즘입니다. 하지만 피보나치 수열에서는 내부적으로 두 번의 재귀를 수행하여 재귀 호출 횟수는 2의 n승으로 수행 비용이 많이 들어갑니다. 만약 한 번 구한 항의 값을 기억해 두었다가 다시 호출할 때 이를 이용하면 비용은 줄어들어요. 이와 같이 경험한 정보를 이용하여 문제를 해결하는 것을 동적 프로그래밍 기법이라 말합니다. 여기에서는 피보나치 수열을 재귀적인 방법과 동적 프로그래밍 방법으로 해결하는 것을 비교해 볼게요. 다음은 피보나치 수열을 재귀적인 방법으로 구현한 코드입니다.unsigned long long Fibonacci(unsigned int n){ long long result = 1; if(n

10. 동적 프로그래밍(DYNAMIC PROGRAMMING) [디딤돌 자료구조와 알고리즘 with C++]

10. 동적 프로그래밍(DYNAMIC PROGRAMMING) 커다란 문제를 여러 단계로 나누어 해결하는 알고리즘들이 있어요. 그 중에 동적 프로그래밍(Dynamic Programming)은 문제를 해결하면서 얻은 체험 정보를 이용하여 문제를 해결하는 알고리즘이예요. 동적 프로그래밍을 이용하면 한 번 해결했던 문제를 다시 해결하지 않을 수 있기 때문에 문제 해결 비용을 줄일 수 있어요. 그리고 여러 단계를 거쳐 문제를 해결하는 복잡한 문제에서 이미 수행한 정보에서 다음 단계를 해결하기 때문에 똑같은 경험을 하지 않고 모든 경우의 경험을 할 수 있어요. 물론 여러 단계로 문제를 해결해야 하는 복잡한 문제에서 모든 경우를 경험하는 것은 컴퓨터로 계산하더라도 지구가 소멸할 시기까지 계산하지 못하는 문제들도 있어..

[라붐] Sugar Sugar

[라붐] Sugar Sugar 멤버: 유정, 소연, 지엔, 해인, 율희, 솔빈 톡톡 튀는 걸 그룹 라붐의 두번째 싱글 앨범인 Sugar Sugar가 2015년 3월 26일 달콤함으로 다가왔습니다. Sugar Sugar, 장난햅, Fantasy 3 개의 곡으로 구성하고 4~6번 트랙은 Inst. 입니다. 트랙 1. Sugar Sugar 앨범 제목이면서 타이틀 곡인 Sugar Sugar는 얼만큼 달콤할 수 있는지 보여주는 것 같아요. 리듬, 보이스, 퍼포먼스, 가사 모두가 달콤과 깜찍함에 녹아듭니다. 트랙 2. 장난햅 Sugar Sugar가 달콤함으로 무장했다면 장난햅은 당찬 귀여움이라고 말하고 싶네요. 익숙한 리듬이지만 평이하지 않은 독특한 라붐만의 매력을 잘 표현하는 곡입니다. 트랙 3. Fantasy ..

[C언어 소스] 힙 정렬(Heap Sort) 알고리즘

힙 정렬(Heap Sort)힙 정렬은 힙 트리를 이용하는 알고리즘입니다. 최대 힙을 사용하면 크기 순(Ascend)으로 정렬하고 최소 힙을 사용하면 크기 역순(Descend)으로 정렬합니다. 힙 정렬은 먼저 힙 트리를 구성합니다. 그리고 루트의 값과 맨 마지막 값을 교환한 후에 정렬 범위를 1 줄입니다. 이와 같은 작업을 반복하여 정렬 범위가 1일 때까지 반복합니다. 최대 힙 트리에서 루트는 최대 값을 갖습니다. 따라서 마지막 값과 교환하면 제일 큰 값이 맨 뒤로 배치할 수 있습니다. 그리고 난 후에 정렬 범위를 줄여나가면 최종적으로 정렬 상태를 만들 수 있는 것입니다. 힙 정렬(base:배열의 시작 주소, n: 원소 개수, compare:비교 논리) 초기 힙 구성 루트와 맨 마지막 자손 교환 n을 1 ..

[C언어 소스] 병합 정렬(Merge Sort, 합병 정렬) 알고리즘

병합 정렬(Merge Sort, 합병 정렬) 알고리즘이번에는 병합 정렬 알고리즘을 살펴봅시다. 병합 정렬 알고리즘은 배열을 작은 단위의 배열로 분할한 후에 분할한 배열을 정렬하고 이들을 다시 정렬하면서 전체 배열을 정렬하는 알고리즘입니다. 병합 정렬(base:배열의 시작 주소, n: 원소 개수, compare:비교 논리) ah:= n/2 bh:= n - ah; 조건(n이 1보다 작거나 같으면) 종료 병합정렬(base,ah,compare) 병합접열(base+ah,bh,compare) tbase에 동적 메모리 할당(원소크기*원소개수) 메모리 복사(tbase,base) ai:=0 bi:=ah i:=0 반복(ai가 ah보다 작으면서 bi가 n보다 작다) 조건(tbase[ai]가 tbase[bi]보다 작거나 같으..

[C언어 소스] 퀵 정렬 (Quick Sort) 알고리즘

퀵 정렬(Quick Sort)퀵 정렬 알고리즘은 재귀적인 방법으로 문제를 해결하는 알고리즘입니다. 퀵 정렬 알고리즘은 피벗 값을 선택하여 피벗 값보다 작은 값들은 왼쪽으로 보내고 큰 값들은 오른쪽으로 보낸 후에 이들 사이에 피벗을 위치시키는 원리를 이용합니다. 이후 피벗보다 작은 값들을 재귀 호출로 정렬하고 피벗보다 큰 값들도 재귀 호출로 정렬하는 방식입니다. 그런데 퀵 정렬은 어떠한 요소를 피벗으로 선택하냐에 따라 성능에 차이가 납니다. 만약 전체 요소의 중간 순위의 요소를 선택하면 재귀 호출에서 반씩 나누어 정렬을 하게 되어 좋은 성능을 발휘합니다. 하지만 가장 작은 값이나 가장 큰 값을 피벗으로 선택하면 최악의 성능을 발휘합니다. 여기에서는 맨 앞과 맨 뒤, 그리고 중간 위치의 요소를 비교하에 세 ..

[C언어 소스] 쉘 정렬(Shell Sort) 알고리즘

쉘 정렬 (Shell Sort) 쉘 정렬은 삽입 정렬 알고리즘을 이용하는 정렬 방식입니다.쉘 정렬은 같은 간격에 있는 원소들을 삽입 정렬 원리로 정렬하는 것을 반복합니다. 간격의 초기값은 배열의 크기/2이며 간격이 1일 때까지 1/2로 줄이면서 반복합니다. 쉘정렬 //쉘 정렬(Shell Sort)#include #define SWAP(a,b) {int t; t = a; a=b; b=t;}//a와 b를 교환 int *origin;int on; void ShellSort(int *base, int n);int main(void){ int arr[10] = { 9,4,3,10,5,8,7,6,2,1 }; origin = arr; on = 10; ShellSort(arr, 10); return 0;}void In..

[C언어 소스] 삽입 정렬(Insertion Sort) 알고리즘

삽입 정렬 (Insertion Sort)이번에는 반복 알고리즘 중에 삽입 정렬 알고리즘을 알아봅시다. 삽입 정렬 알고리즘은 점진적으로 정렬 범위를 넓혀 나가는 방식으로 정렬하는 알고리즘입니다. 이를 위해 새로운 범위에 포함하는 마지막 원소를 앞으로 이동하면서 자신보다 작은 요소를 찾을 때까지 이동하면서 자리를 교환합니다. 삽입 정렬(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 아니면 루프 탈출 삽입정렬 //삽입 정렬(Insertion Sort)#include #define SWAP(a..

[C언어 소스] 선택 정렬(Selection Sort) 알고리즘

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

반응형