—ฅ/ᐠ. ̫ .ᐟ\ฅ —

기타 문제 풀이

[백준] 11931 수 정렬하기 4

WIFI-Aircat 2025. 5. 12. 21:46

🆀 문제

주어진 수에 대하여 내림차순 정렬하기


🅰 나의 풀이

흔한 내림차순 정렬하기 문제이지만 시간 제한이 걸려있다는 게 핵심이다.

pivot이 잘 정해진다면 평균적으로 O(n log n)의 시간 복잡도를 가지는 Quick sort를 선택했다.

void quicksort(int arr[], int l, int r){
    if (l >= r) return; 

    int left = l;
    int right = r;
    int pivot =  arr[(l+r) / 2];

    while (l < r){ 
    // 오름차순 정렬을 하고 싶다면 부등호 방향을 바꾸면 된다
        while (arr[l] > pivot) l++; // pivot보다 클 때까지 l을 증가
        while (arr[r] < pivot) r--; // pivot보다 작을 때까지 r을 감소
        
        if (l <= r) { // ??
            int temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            l++;
            r--;
        }
    }
    quicksort(arr, left, r);
    quicksort(arr, l, right);
}
int main() {
    int n;
    scanf("%d", &n);

    int *arr = (int*)malloc(sizeof(int) * n);
    if (arr == NULL){
        printf("malloc err\n"); exit(1);
    }
    for (int i=0;i<n;i++){
        scanf("%d", &arr[i]);
    }

    quicksort(arr, 0, n-1);

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

    free(arr);

    return 0;
}

🆂 다른 풀이

1.

swap 전에 `if (l <= r)`처럼 조건문이 한번 더 필요했던 이유는

while의 `(l < r)` 조건이 있지만 내부에서 l과 r이 변하기 때문이다.

그런데 중복 조건처럼 보이고 마음에 안 든다.

    while (1){ 
        while (arr[l] > pivot) l++;
        while (arr[r] < pivot) r--;

        if (l > r) break;

        int temp = arr[l];
        arr[l] = arr[r];
        arr[r] = temp;
        l++;
        r--;
    }

`break;`를 사용하면 중복 조건의 느낌을 지울 수 있고 더 직관적인 것 같다.

 

2.

C에는 qsort 함수가 있다...!!!

int compare(const void *a, const void *b) {
    return (*(int *)b - *(int *)a);
}

qsort(arr, n, sizeof(int), compare);

이렇게 compare 함수만 만들어주면 된다...!


 

반응형

'기타 문제 풀이' 카테고리의 다른 글

[백준] 1181 단어 정렬  (0) 2025.05.18
[백준] 24262~7 시간 복잡도  (0) 2025.04.08
[백준] 10171, 10172 고양이와 개  (4) 2024.12.24
[프로그래머스] Lv.1 실패율  (3) 2024.11.22
[백준] 2743 단어 길이 재기  (1) 2024.11.22