본문 바로가기

Algorithm/Sorting

(C++) - 백준(BOJ) 1926번 : 수 정렬하기 5

반응형

www.acmicpc.net/problem/15688

 

15688번: 수 정렬하기 5

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이며, 같은 수가 여러 번 중복될 수도 있다.

www.acmicpc.net

counting sort를 사용하는 문제였습니다.

 

 

풀이방법

 1. 입력받은 수를 세줍니다. x라는 수의 개수는 num이라는 배열의 x번째 index의 값이 됩니다.

 *음수 입력이 들어올 수 있으니 index를 100만만큼 더한 후 해당 index 값을 1씩 증가하도록 합니다.

 

이런식으로 입력이 들어왔다고 가정했을 때 배열의 index로는 음수를 표현할 수 없으므로 오른쪽으로 100만칸을 미는겁니다.

 

2. 출력합니다. num[i]가 0일 때까지 i-1000000을 출력해줍니다. 

 

Code

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
int n;
int num[200'0001];
int main(){
    fastio;
    cin >> n;
    for(int i = 0; i < n; i++) {
        int x;
        cin >> x;
        num[x + 1000000]++;
    }
    for(int i = 0; i <= 2000000; i++){
        if(!num[i]) continue;
        while(num[i]--) cout << i - 1000000 << '\n';
    }
}