본문 바로가기
[백준]

[BaekJoon/백준] 2751번

by Hevton 2020. 11. 26.
반응형

이 문제를 풀기까지의 여행은 10월 5일로 거슬러올라간다...

소트 문제들이 서서히 나오는걸보고, 아 공부좀 해야겠다 싶어서 '자료구조와 알고리즘' 도서를 구입해 공부했고

현재 정렬단원을 마무리해서, 이제 다시 백준을 풀어본다!!!!!!

 

총 3가지로 풀었다.

 

1. Merge_Sort (병합 정렬) Feat. 배열 공유방식

#include <stdio.h>
#include <stdlib.h>

static int *buff;

void __merge_sort(int a[], int left, int right) {
    if(left < right) {
        int p = 0;
        int i;
        int j = 0;
        int k = left;
        int center = (left + right) / 2;
        
        __merge_sort(a, left, center);
        __merge_sort(a, center+1, right);
        
        for(i = left; i <= center; i++) {
            buff[p++] = a[i];
        }
        
        while(i <= right && j < p) {
            a[k++] = (buff[j] <= a[i])?buff[j++]:a[i++];
        }
        
        while(j < p) {
            a[k++] = buff[j++];
        }
    }
}

int merge_sort(int a[], int n) {
    if((buff=calloc(n, sizeof(int))) == NULL)
       return -1;
    __merge_sort(a, 0, n - 1);
    free(buff);
    return 0;
}

int main() {
    int i, nx;
    int *x;
    scanf("%d", &nx);
    
    x = calloc(nx, sizeof(int));
    
    for(i = 0; i < nx; i++)
        scanf("%d", &x[i]);
    
    merge_sort(x, nx);
    
    for(i = 0; i < nx; i++)
        printf("%d\n", x[i]);
 
    free(x);
    
    return 0;
}

2. Merge_Sort (병합정렬) Feat. 배열공유 x 방식 (직관적)

#include <stdio.h>
#include <stdlib.h>

void merge_sort(int a[], int n, int c[]) {
    
    int mid = (n - 1) / 2;
    
    if(n >= 2) {
        merge_sort(a, mid + 1, c);
        merge_sort(a + mid + 1, n -(mid + 1), c);
                
        int pa = 0, pb = mid + 1, pc = 0;
        
        while(pa <= mid && pb <= n - 1) {
            a[pa] <= a[pb] ? (c[pc++]=a[pa++]):(c[pc++]=a[pb++]);
        }
        while(pa<=mid)
            c[pc++] = a[pa++];
        while(pb<=n-1)
            c[pc++] = a[pb++];
        
        for(int x = 0; x < n ; x++) {
            a[x] = c[x];
        }
    }
}

int main() {
    int i, nx;
    int *x, *b;
    scanf("%d", &nx);
    
    x = calloc(nx, sizeof(int));
    b = calloc(nx, sizeof(int));

    
    for(i = 0; i < nx; i++)
        scanf("%d", &x[i]);
    
    merge_sort(x, nx, b);
    
    for(i = 0; i < nx; i++)
        printf("%d\n", x[i]);
 
    free(x);
    free(b);
    
    return 0;
}

3. Heap_Sort (힙정렬)

#include <stdio.h>
#include <stdlib.h>

#define swap(type, x, y) do { type t = x; x = y; y = t;} while(0)

static void downheap (int a[], int left, int right) {
    int temp = a[left];
    int child;
    int parent;
    
    
    for(parent = left; parent < (right + 1) / 2; parent = child) {
        int cl = parent * 2 + 1;
        int cr = cl + 1;
        
        child = (cr <= right && a[cr] > a[cl]) ? cr : cl;
        
        if(temp >= a[child])
            break;
        
        a[parent] = a[child];
    }
    a[parent] = temp;
}

void heap_sort(int a[], int n) {
    int i;
    
    for(i = (n - 2) / 2; i >= 0; i--) {
        downheap(a, i, n - 1);
    }
    for(i = n - 1; i > 0; i--) {
        swap(int, a[0], a[i]);
        downheap(a, 0, i - 1);
    }
}

int main(void) {
    int i, nx;
    int *x;
    scanf("%d", &nx);
    x = calloc(nx, sizeof(int));
    
    for(i = 0; i < nx; i++) {
        scanf("%d", &x[i]);
    }
    
    heap_sort(x, nx);
    for(i = 0; i < nx; i++) {
        printf("%d\n", x[i]);
    }
    
    free(x);
    
    return 0;
}

 

기분좋다아~ 공부하던 책의 오류도 찾았다 ㅋㅋ

반응형

'[백준]' 카테고리의 다른 글

[BaekJoon/백준] 2108번  (0) 2020.11.28
[BaekJoon/백준] 10989번  (0) 2020.11.27
[BaekJoon/백준] 2750번  (0) 2020.10.05
[BaekJoon/백준] 1436번  (0) 2020.10.03
[BaekJoon/백준] 1018번  (0) 2020.10.03