1 분 소요

배열 합치기 (백준 11728)

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

문제의 난이도 자체는 쉬운 편이나
C++에서 대량의 입출력 데이터를 다뤄야 하는 경우에 대한 내용이 포함되어
TIL을 남긴다

이 문제에선
std::cin.tie(NULL);
std::ios_base::sync_with_stdio(false);
과 적용해야 문제를 통과할 수 있는데

해당 함수들에 대하여 더 알아보자면
cin.tie(null)를 호출하게 되면
다른 스트림과의 연결이 끊어지게 된다
즉, cin이 ‘cout’,’cerr’ 과 같은 다른 C++ 버퍼등과의
연동이 끊어지게 된다는 것을 의미한다
(cin과 다른 버퍼가 fflush 등을 호출하여
자동적으로 서로의 버퍼를 비워주지 않도록 설정)

기본적으로 cin.tie은 ‘연동 상태’인데
이는 ‘사용자 편의성’과 ‘실수 방지’의 역할을 위함이다

cin, cout는 내부적으로 표준 입출력 스트림과 연동되어 있고
사용자가 입출력 시, 자동으로 버퍼를 비워줄 필요 없이
자동적으로 버퍼를 비우는 등의 역할을 해준다
(이렇게 설계함으로서, 사용자가 입출력에 대한 고민 없이
자신의 코드를 작성할 수 있도록 편의성을 제공하였으며
또한 입출력 함수 사용에 다른 실수를 줄일 수 있음)

그러나, 대규모 데이터 입출력 시,
버퍼를 자동적으로 비워주게 되는 부분에서 ‘오버헤드’가 발생하게 되므로
cin.tie(null)을 호출하여 코드 최적화를 할 수 있도록 여지를 남겨두었다

또한 sync_with_stdio(false)를 호출하는 경우,
C의 stdio 의 표준 입출력 스트림인 ‘stdin’ ‘stdout’ ‘stderr’ 등과
C++의 표준 입출력 스트림인 ‘cin’ ‘cout’ ‘cerr’ ‘clog’ 등과의 연동이 끊어지게 된다

이들은 각각 별도의 입출력 버퍼를 가지나
기본적으로 서로의 버퍼를 sync하도록 되어 있기에
추가적인 오버헤드가 발생할 수 있다

default가 true인 이유는
C와 C++의 호환성을 위함이다
C++에서 C 표준 라이브러리의 이용을 쉽게 할 수 있게 한다

그러나 대규모의 데이터 입출력 등 ‘성능’이 필요한 경우
이러한 버퍼의 sync를 끊어 성능을 향상시킬 수 있다

요점은 입출력에 대하여 성능이 중요한 경우
입출력 버퍼를 최적화할 수 있다라는 점이다

Code

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int a, b;
	cin >> a >> b;

	vector<int> valVec;

	valVec.clear();

	int temp;
	for (int i = 0; i < a + b; i++)
	{
		cin >> temp;
		valVec.emplace_back(temp);
	}

	sort(valVec.begin(), valVec.end());

	for (auto com : valVec)
	{
		cout << com << " ";
	}

	return 0;
}

댓글남기기