๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[๋ฐฑ์ค€] 11650๋ฒˆ: ์ขŒํ‘œ ์ •๋ ฌํ•˜๊ธฐ - C++ ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„/๋ฐฑ์ค€

[๋ฐฑ์ค€] 11650๋ฒˆ: ์ขŒํ‘œ ์ •๋ ฌํ•˜๊ธฐ - C++

.23 2021. 8. 9. 00:28
๋ฌธ์ œ

2์ฐจ์› ํ‰๋ฉด ์œ„์˜ ์  N๊ฐœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ขŒํ‘œ๋ฅผ x์ขŒํ‘œ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์œผ๋กœ, x์ขŒํ‘œ๊ฐ€ ๊ฐ™์œผ๋ฉด y์ขŒํ‘œ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ •๋ ฌํ•œ ๋‹ค์Œ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ ์˜ ๊ฐœ์ˆ˜ N (1 ≤ N ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” i๋ฒˆ์ ์˜ ์œ„์น˜ xi์™€ yi๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (-100,000 ≤ xi, yi ≤ 100,000) ์ขŒํ‘œ๋Š” ํ•ญ์ƒ ์ •์ˆ˜์ด๊ณ , ์œ„์น˜๊ฐ€ ๊ฐ™์€ ๋‘ ์ ์€ ์—†๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ ์„ ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


์ •๋ ฌ์„ ์ด์šฉํ•˜์—ฌ ํ‘ธ๋Š” ๋ฌธ์ œ.

๋ณ‘ํ•ฉ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ’€์—ˆ๊ณ , x์ขŒํ‘œ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์œผ๋กœ - x์ขŒํ‘œ๊ฐ€ ๊ฐ™์œผ๋ฉด y์ขŒํ‘œ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์•ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด๋ฌธ์„ ํ•˜๋‚˜ ๋” ๋ถ™์˜€๋‹ค.

 

์ฝ”๋“œ
#include <cstdio>

void merge(int** sorted, int** arr, int begin, int mid, int end);
void mergeSort(int** sorted, int** arr, int begin, int end);
void printArr(int** arr, int n);

int main(void) {
    int n;
    scanf("%d", &n);

    int** arr = new int*[n];
    for(int i = 0; i < n; i++) {
        arr[i] = new int[2];
    }
    int** sorted = new int*[n];
    for(int i = 0; i < n; i++) {
        sorted[i] = new int[2];
    }

    for(int i = 0; i < n; i++) {
        scanf("%d %d", &arr[i][0], &arr[i][1]);
    }

    mergeSort(sorted, arr, 0, n - 1);
    printArr(arr, n);

    for(int i = 0; i < n; i++) {
        delete[] arr[i];
        delete[] sorted[i];
    }
    delete[] arr;
    delete[] sorted;
    return 0;
}

void merge(int** sorted, int** arr, int begin, int mid, int end) {
    int i, j, k;
    i = begin;
    j = mid + 1;
    k = begin;

    while(i <= mid && j <= end) {
        if(arr[i][0] < arr[j][0]) {
            sorted[k][0] = arr[i][0];
            sorted[k][1] = arr[i][1];
            i++;
        }
        else if(arr[i][0] == arr[j][0]) {
            if(arr[i][1] < arr[j][1]) {
                sorted[k][0] = arr[i][0];
                sorted[k][1] = arr[i][1];
                i++;
            }
            else {
                sorted[k][0] = arr[j][0];
                sorted[k][1] = arr[j][1];
                j++;
            }
        }
        else {
            sorted[k][0] = arr[j][0];
            sorted[k][1] = arr[j][1];
            j++;
        }
        k++;
    }
    if(i > mid) {
        for(int a = j; a <= end; a++, k++) {
            sorted[k][0] = arr[a][0];
            sorted[k][1] = arr[a][1];
        }
    }
    else {
        for(int a = i; a <= mid; a++, k++) {
            sorted[k][0] = arr[a][0];
            sorted[k][1] = arr[a][1];
        }
    }

    for(int a = begin; a <= end; a++) {
        arr[a][0] = sorted[a][0];
        arr[a][1] = sorted[a][1];
    }
}

void mergeSort(int** sorted, int** arr, int begin, int end) {
    int mid;
    if(begin < end) {
        mid = (begin + end) / 2;
        mergeSort(sorted, arr, begin, mid);
        mergeSort(sorted, arr, mid + 1, end);
        merge(sorted, arr, begin, mid, end);
    }
}

void printArr(int** arr, int n) {
    for(int i = 0; i < n; i++) {
        printf("%d %d\n", arr[i][0], arr[i][1]);
    }
}
Comments