Study hard

(c++)백준 10989번: 수 정렬하기 3 본문

백준/여러가지 문제들

(c++)백준 10989번: 수 정렬하기 3

Nimgnoej 2020. 6. 11. 19:24

https://www.acmicpc.net/problem/10989

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

[풀이]

처음에 C++ STL의 sort함수를 이용하여 풀려고 하였으나, 메모리 초과가 떴다. 

그래서 원소의 개수가 10001인 배열 Num[]을 만들어 입력 받는 수 x에 대해 Num[x]의 수를 +1 하여 해당 수가 몇 번 들어왔는지 기록한 뒤, Num[1]~Num[10000]까지 0보다 큰 값이 있는 index를 값만큼 출력하는 프로그램을 짰다.

이 방법을 쓸 때 cin, cout을 썼더니 시간초과가 떴다. cin과 cout이 scanf와 printf보다 많이 느리긴 하지만 시간초과에 영향을 주는 것은 이번이 처음이라 당황스러웠다.

최종적으로 scanf와 printf를 쓰니 통과하였다. 

 

#include <iostream>
#include <cstdio>//scanf, printf
using namespace std;

int N;
int Num[10001];//각 숫자가 몇개 들어왔는지 저장

void input() {
	int n;
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		scanf("%d", &n);
		Num[n]++;
	}
}

void solution() {
	input();
	int cnt = 0;//cnt가 N이 되면 끝내기
	for (int i = 1; i <= 10000; i++) {
		if (Num[i] > 0) {
			for (int j = 0; j < Num[i]; j++) {
				printf("%d\n", i);
				cnt++;
			}
		}
		if (cnt == N)
			return;
	}
}

int main() {
	solution();
	return 0;
}