개발/백준

[백준] 10989번. 수 정렬하기 3 (C++)

yun000 2023. 6. 14. 00:19

문제 설명

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

 

10989번: 수 정렬하기 3

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

www.acmicpc.net

 

해결 방향

N의 범위가 늘어났기 때문에

수 정렬하기1,2 처럼 vector와 sort를 사용하면 메모리 초과가 뜨게 된다

따라서 다른 방식으로 접근해야한다.

 

또한 cin cout을 사용하면 시간 초과가 뜨기 때문에 scanf 와 printf를 사용했다

cin cout을 사용하고싶다면 

ios::sync_with_stdio(false);
cin.tie(NULL);

를 main함수 안에 붙여주면 된다.

 

 

내가 작성한 코드이다.

#include<iostream>
#include<vector>
using namespace std;

int main()
{

	int N;
	scanf("%d", &N);

	vector<int>num(10001,0);


	for (int i = 0; i < N; i++)
	{
		int number;
		scanf("%d", &number);
		num[number]++;
	}

	for (int i = 0; i <10001; i++)
	{
		if (num[i] != 0) 
		{ 
			for (int j = 0; j < num[i]; j++)
			{ printf("%d\n", i); }
		}
	}

}


vector<int>num(10001,0);

N의 범위는 10,000,000까지 이지만

입력할 수 있는 숫자의 최대 크기는 10000이다.

따라서 해당 숫자를 몇개 입력 받는지를 판단하는 방식을 사용할 것이다.

10001크기의 vector num을 만들고 0으로 초기화해준다.

 

예를 들어 아래와 같이 입력한다면

 

N=10

1   10   1   4   2   12   334   2   2   2

 

배열에는 다음과 같이 저장될 것이다.

num[1]=2

num[10]=1

num[4]=1

num[2]=4

num[12]=1

num[334]=1

 

 

for (int i = 0; i < N; i++)
{
    int number;
    scanf("%d", &number);
    num[number]++;
}

위에 설명한 방식으로 배열을 채워나간다.

number를 입력받으면

number인덱스에 해당하는 num배열의 갯수가 하나씩 늘어난다.



for (int i = 0; i <10001; i++)
{
    if (num[i] != 0) 
    { for (int j = 0; j < num[i]; j++) { printf("%d\n", i); } }
}

num[i]==0이라면 해당 수 i는 입력받은 적이 없으므로 넘어간다.

0이 아니라면 배열에 저장된 수 만큼 i를 출력한다.