BOJ - 10989 - 수 정렬하기 3
문제
SOL
- 데이터의 개수가 1 ~10,000,000개 주어진다.
- O(N * log N) 사용 - 데이터가 방대하다.
- 데이터의 범위는 10,000 보다 작거나 같은수다.
- 계수정렬(Counting Sort) - 범위가 다소 작다.
구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
using namespace std;
// 데이터의 개수 입력 후 데이터 입력 하기
// 카운팅할 배열 선언
// 카운팅 하기
// 카운팅 한 배열 출력
int main()
{
// counting arr
int arr[10001]={0};
int num;
int tmp;
// 데이터 입력
cin >> num;
for(int i=1; i <= num; i++)
{
scanf("%d", &tmp);
arr[tmp]++;
}
// 결과 출력
for(int i=1; i < 10001; i++)
while(arr[i] != 0)
{
cout << i << '\n';
arr[i]--;
}
return 0;
}
입력을 받을 때 std::cin, cout 보다 scanf, printf가 더 빠르다.
사람들이 C 형식으로 푸는것은 다 이유가 있구나라는 생각이 든다.
std::cin, cout 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
using namespace std;
// 데이터의 개수 입력 후 데이터 입력 하기
// 카운팅할 배열 선언
// 카운팅 하기
// 카운팅 한 배열 출력
int main()
{
ios_base :: sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
// counting arr
int arr[10001]={0};
int num;
int tmp;
// 데이터 입력
cin >> num;
for(int i=1; i <= num; i++)
{
cin >> tmp;
arr[tmp]++;
}
// 결과 출력
for(int i=1; i < 10001; i++)
while(arr[i] != 0)
{
cout << i << '\n';
arr[i]--;
}
return 0;
}
물론 위와 같은 방법으로 std::cin, cout을 가속화 하여 쓸 순 있지만 일종의 편법이라 하니 되도록 효율성을 높일 땐 C스타일의 코딩법을 생각해보자.