• toc {:toc}

문제 확인하기

풀이

  1. sort 함수를 이용하여 풀이 sort 함수는 기본적으로 오름차순으로 설정되어 있기 때문에 내림차순으로 정렬하기 위해선 greater<>()를 넣어줘야 한다. 본래 <> 안에 자료형을 명시해줘야 하나, C++14부터는 명시해주지 않아도 사용할 수 있다.

  2. Quick Sort를 구현하여 풀이

  • Quick sort 과정.
    • pivot을 잡는다. (시작, 중간, 끝 등 많은 방식이 있다. 나는 시작값으로 잡았다.)
    • left = i는 맨 왼쪽, right = j 는 맨 오른쪽에서 출발한다.
    • left의 경우 pivot보다 큰 경우를 찾는다. 끝에 도달할 때까지 찾는다.
    • right의 경우 pivot보다 작은 경우를 찾는다. 끝에 도달할 때까지 찾는다.
    • 만약 left와 right가 서로 엇갈린 경우 pivot과 right를 바꿔준다. 이렇게 되면 pivot의 왼쪽에는 pivot 보다 큰 값만 남게 된다.
    • 엇갈리지 않고 left와 right가 결정된 경우 두 값을 바꿔준다.
#include <bits/stdc++.h>
using namespace std;
 
int num[11];
 
void quick_sort(int *data, int start, int end){
    if(start >= end){
        // 원소가 1개인 경우
        return; 
    }
    
    int pivot = start;
    int i = pivot + 1; // 왼쪽 출발 지점 
    int j = end; // 오른쪽 출발 지점
    int temp;
    
    while(i <= j){
        // 포인터가 엇갈릴때까지 반복
        while(i <= end && data[i] >= data[pivot]){
            i++;
        }
        while(j > start && data[j] <= data[pivot]){
            j--;
        }
        
        if(i > j){
            // 엇갈림
            temp = data[j];
            data[j] = data[pivot];
            data[pivot] = temp;
        }else{
            // i번째와 j번째를 스왑
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
        }
    } 
    
    // 분할 계산
    quick_sort(data, start, j - 1);
    quick_sort(data, j + 1, end);
}
 
// quick sort 구현해서 풀이
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
    int N, idx = 0, k;
    cin >> N;
    while(true){
        k = N % 10;
        num[idx++] = k;
        N = N/10;
        if(N == 0) break;
    }
 
    quick_sort(num, 0, idx-1);
 
    for(int i = 0; i<idx; i++){
        cout << num[i];
    }
 
    return 0;
}
 
// sort 함수 사용하여 풀이
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
    string N;
    cin >> N;
    sort(N.begin(), N.end(), greater<>());
    cout << N << '\n';
 
    return 0;
}