문제설명

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	ios_base::sync_with_stdio(false); //표준 스트림 동기화 해제
	cin.tie(NULL); //입력과 출력 연결 끊기
	int N;
	cin >> N;
	int* arr = new int[N];
	for (int i = 0; i < N; ++i) cin >> arr[i];
	sort(arr, arr+N);
	for (int i = 0; i < N; ++i)cout << arr[i] << '\n';
}

 

설명

  • algorithm 라이브러리에 있는 sort() 함수를 사용
  • 배열 동적할당
  • sort 함수의 첫 번째 매개변수는 배열의 포인터, 두 번째 매개변수는 배열의 포인터 + 배열의 크기를 넣어주면 내림차순으로 정렬이 된다.
  • sort(arr, arr + N)
시간제한이 C / C++기준으로 2초이기 때문에 아래의 과정을 수행해야한다.

C와 C++과의 표준 스트림 동기화 해제입력과 출력 연결 해제endl 대신 \n 쓰기
cout(출력) cin(입력)과의 묶인것을 해제시키지 않고, C와 C++과의 입출력 동기화를 해제하지 않으면 이 문제는 틀리게 된다.
기본적으로 C++에서는 C의 표준 스트림이 동기화가 되어있다.
C와 C++가 동일한 버퍼를 공유한다는 말이다.
이러한 동기화는 성능을 저하시키지만 스레드로부터 안전하기 때문에 동기화 상태로 두는 것이 더 좋긴 하다.
하지만 알고리즘 문제풀이 또는 예외처리나 멀티스레드 작업을 필요로 하지 않는 작업에서는 동기화를 끊어주면 속도가 빨라진다.
(C++ 표준 스트림이 독립적으로 IO(intput, output)버퍼링을 할 수 있다는 것이다. 이렇게 되면 상당히 많은 양의 입출력이 있을 경우 동기화되어있는 상태에 비해 성능이 많이 좋아진다.)

endl은 단순히 줄 바꿈만 해주는 것이 아니라 출력 버퍼를 비우는 역할까지 한다.
매 줄 바꿈마다 endl을 쓰면 입출력을 끊어주는 효과를 볼 수 없다.