본문 바로가기
코딩 테스트/백준

[C++][백준][정렬]2751 - 수 정렬하기 2

by 계양구놈팽이 2023. 3. 6.

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

 

2751번: 수 정렬하기 2

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

www.acmicpc.net

이 문제의 함정은 로직보다, C++에서 제공하는 기능을 생각없이 사용 했을때 빠지기 쉽다.

예제코드 두개를 준비하였다.

예제코드 1

#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);

	int total_no;

	std::cin >> total_no;
	std::vector<int> numbers(total_no);
	
	for (int i = 0; i < total_no; i++)
	{
		std::cin >> numbers[i];
	}

	std::sort(numbers.begin(), numbers.end());

	for (auto& num : numbers)
	{
		std::cout << num << "\n";
	}

	return 0;
}

예제코드 2

#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);

	int total_no;

	std::cin >> total_no;
	std::vector<int> numbers(total_no);
	
	for (int i = 0; i < total_no; i++)
	{
		std::cin >> numbers[i];
	}

	std::sort(numbers.begin(), numbers.end());

	for (auto& num : numbers)
	{
		std::cout << num << std::endl;
	}

	return 0;
}

 

예제를 돌려보자. 예시1번은 정답이고, 예시 2번은 시간 초과가 발생하였다.

중복되지 않는 숫자를 다시 순차적으로 나열할 뿐인 이 간단한 문제에 무슨 함정이 있을까?

 

그것은 std::endl의 내부 기능을 제대로 파악하지 않았을 때 발생한다.

std::endl은 출력 버퍼를 비우는 작업을 추가로 수행하기 때문에 \n보다 느릴 수 있다. 

출력 버퍼를 비우는 작업은 I/O 시스템 콜을 수행해야 하므로 비교적 오버헤드가 크다.

 

However, std::endl을 사용하면 즉시 출력 버퍼를 비워내고 줄 바꿈을 수행할 수 있으므로 \n보다 더 빠를 수 있다.

그러니 절대는 없다. 단지 이 문제에는 단순한 줄 바꿈이 더 효과적 일 뿐이다.

'코딩 테스트 > 백준' 카테고리의 다른 글

[백준][c++]14500-테트로미노  (0) 2022.06.12
[백준][C++]11399-ATM  (0) 2022.05.27
[백준][C++]1158-요세푸스 문제 0  (0) 2022.05.27