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 |