1 minute read

❓문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

✏️입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

📜출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

💻코드

/*
	 [백준 2750] 수 정렬하기
	  22-08-02 / c++

	  N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
 */

/*
	 [백준 2751] 수 정렬하기2
	  22-08-02 / c++

	  N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
	  시간복잡도가 O(nlogn)인 정렬 사용하기
 */

#include<iostream>
#include<algorithm>

using namespace std;

int main(void) {
	ios_base::sync_with_stdio(false);

	int SIZE;
	cin >> SIZE;

	int* arr = new int[SIZE];

	for (int i = 0; i < SIZE; i++)
	{
		cin >> arr[i];
	}

	sort(arr, arr + SIZE);

	for (int i = 0; i < SIZE; i++)
	{
		cout << arr[i] <<"\n";
	}
	return 0;
}	

  • C++의 sort함수가 워낙 강력하기 때문에 쉽게 풀 수 있었다.

  • 시간을 줄이기 위해 endl 대신 \n을 사용했는데, 버퍼를 비우는 endl은 상대적으로 시간이 걸리기 때문이다.

  • 또한, ios_base::sync_with_stdio(false);를 작성해줬는데, 이로 인해 C의 stdio와 C++의 iostream을 동기화를 비활성화 시켜 두 가지의 버퍼를 사용할때 생기는 딜레이를 줄일 수 있고 따라서 시간을 줄일 수 있다.

  • 그대신, thread-safe가 깨지면서 안정성이 떨어지게 된다. 원래는 IO의 순서가 예상한 것과 일치하게 되는데, 동기화를 비활성화 한다면 cinscanf를 동시에 사용할 때, 출력 순서를 보장할 수 없게 된다.