본문 바로가기

Algorithm

[C code] 백트래킹(Backtracking ; 퇴각검색), N-Queen 문제 백트래킹은 한정 조건을 가진 문제(Constraint Satisfaction Problem ; 제약 충족 문제)를 풀려는 전략이다 이미 지나쳐온 곳을 다시 돌아가서 다른 가능성을 시도해보는 걸 반복하는 기법 ! 브루트포스는 꼭 '깊이'나 '탐색'의 개념이 아니더라도, 모든 경우의 수를 다 대입해보는 것이기 때문에 다른 개념이다 조건에 맞지 않는 경우들을 배제해가며, 모든 조합을 하나씩 시도해서 문제의 해를 찾는다 보통 재귀 함수로 구현이 되고 DFS와 비슷하게 스택을 쓰는 경우가 많지만, 기억 공간은 덜 차지한다 ( 아래 의사코드 11, 13 Line - 퇴각하며 "apply"했던 "value"를 다시 "remove"하여 돌려놓음 -> 조건 초기화 ※중요※ ) 의사코드는 다음과 같다 void findSo.. 더보기
[C code] 원형 큐 (Circular Queue) #include #include #define size 10 typedef struct Queue { int front, rear; int * data; }Queue; void EnQ(Queue * q, int data) { if(q->front == (q->rear+1)%size) //FullQ { puts("Queue is Full"); return; } else { q->rear = (q->rear+1)%size; q->data[q->rear] = data; } return; } int DeQ(Queue * q) { if(q->front == q->rear) //EmptyQ { puts("Queue is Empty"); return; } else { q->front = (q->front+1)%siz.. 더보기
[C code] 퀵 정렬 (Quick Sort) #include #include void Swap(int * a, int * b) { int temp = *a; *a = *b; *b = temp; } int Partition(int arr[], int l, int r) { int pivot = arr[r]; int smll = l-1; // pivot보다 작은 수 찾는 index // pivot보다 큰 값이 있으면, arr[smll]과 바꾸기 for(int bg=l ; bg 더보기
[C code] 합병 정렬 (Merge Sort) #include #include // Function to merge an array // with l(left), m(middle), r(right) index void Merge(int arr[], int l, int m, int r) { int i, j, k; // Sizes of arrays int n1 = m-l+1; // l ~ m int n2 = r-m; // m+1 ~ r // Copy data to temp array L[] and R[] int L[n1]; int R[n2]; for(i=0 ; i 더보기
[C code] 버킷 정렬 (Bucket Sort) 버킷 정렬 또는 버킷 소트(Bucket sort)는 수많은 버킷에 배열 요소들을 분산시킴으로써 동작하는 정렬 알고리즘이다 (통에 담듯이) 각 버킷은 그 뒤로 개별 정렬되는데, 이는 다른 정렬 알고리즘을 사용하거나 버킷 정렬 알고리즘을 반복 적용시켜 수행한다 버킷의 정렬은 다음과 같이 이루어진다: 1) 처음에 비어있는 버킷들의 배열을 배치한다 2) 분산 : 원래의 배열을 살펴보고 각 객체를 버킷에 담는다 3) 비어있지 않은 각 버킷을 정렬한다 4) 수집 : 순서대로 버킷을 방문하여 모든 요소를 원래의 배열에 위치시켜 놓는다. #include #include // Bucket Sort void BucketSort(float arr[], int n) { float bucket_arr[10][n] ; int c.. 더보기