🏃‍♀️ 코테 연습

[C++] 백준 15552번

ji-hyun 2023. 2. 8. 23:41

아래는 백준의 설명 글이다

 

https://www.acmicpc.net/board/view/22716

 

글 읽기 - 추가 설명 및 다른 언어 빠른 입출력 방법

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

  • 아래 얘기는 cin, cout을 쓸 때의 얘기지, scanf/prinf로 입출력을 하고자 하신다면 그냥 쓰시면 됩니다. scanf/printf는 충분히 빠릅니다.


  • endl은 개행문자를 출력할 뿐만 아니라 출력 버퍼를 비우는 역할까지 합니다. 그래서 출력한 뒤 화면에 바로 보이게 할 수 있는데, 그 버퍼를 비우는 작업이 매우 느립니다. 게다가 온라인 저지에서는 화면에 바로 보여지는 것은 중요하지 않고 무엇이 출력되는가가 중요하기 때문에 버퍼를 그렇게 자주 비울 필요가 없습니다. 그래서 endl을 '\n'으로 바꾸는 것만으로도 굉장한 시간 향상이 나타납니다.


  • cin.tie(NULL)은 cin과 cout의 묶음을 풀어 줍니다. 기본적으로 cin으로 읽을 때 먼저 출력 버퍼를 비우는데, 마찬가지로 온라인 저지에서는 화면에 바로 보여지는 것이 중요하지 않습니다. 입력과 출력을 여러 번 번갈아서 반복해야 하는 경우 필수적입니다.


  • ios_base::sync_with_stdio(false)는 C와 C++의 버퍼를 분리합니다. 이것을 사용하면 cin/cout이 더 이상 stdin/stdout과 맞춰 줄 필요가 없으므로 속도가 빨라집니다. 단, 버퍼가 분리되었으므로 cin과 scanf, gets, getchar 등을 같이 사용하면 안 되고, cout과 printf, puts, putchar 등을 같이 사용하면 안 됩니다.

 

 

 

 

 

 


위의 설명글을 좀 더 자세히 알아보자


ios_base::sync_with_stdio(false);의 장점

c++ 만의 독립적인 버퍼가 생긴다 (c 버퍼와 병행적으로 사용 불가)

원래 c 와 c++ 은 표준 스트림이 동기화 되어 있다

무슨 말인가 하면, C++에서 C와 C++ 각각의 스타일로 입출력을 받아도 서로 동기화하여 우리가 입력 혹은 출력하고자 하는 순서대로 결과를 얻을 수 있다. 즉, C와 C++가 동일한 버퍼를 공유한다는 것이다.

(만약 스트림에 대한 개념이 없다면 C와 C++가 입출력을 항시 공유상태라고 이해하는 것이 좀 더 이해가 수월할 것이다.)

 

 

 

 

 

cin.tie(null) 장점

 

cin.tie(NULL);	// 또는 cin.tie(nullptr), cin.tie(0) 으로 대체 가능

 

기본적으로 입력과 출력은 연결되어 있다

= 기본적으로 cin 과 cout 은 묶여있다

 

 

무슨 말인가 하면, 기본적으로 입력 요청이 들어오면 그 전에 출력 작업이 있었을 경우(출력 버퍼에 내용이 있는 경우) 버퍼를 비워(flush) 출력을 하게 된다.

좀 더 쉽게 말하자면 입력 요청을 통해 읽어들이게 될 경우 이 전에 있던 출력 작업들을 콘솔창에 보이도록 버퍼를 비운다는 것이다.

 

=> 원래 입력할 때 출력 버퍼를 비워서 출력. 그러면 콘솔창에 출력 보임

 

 

 

예시

따라서 cin.tie(NULL) 을 써주면 출력 버퍼를 비우지 않는다

 

#include <iostream>
 
using namespace std;
 
int main(int argc, char const *argv[]) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
 
	int a;
	for (int i = 0; i < 10; i++) {
		cout << i << "번 째 입력\n";
		cin >> a;
	}
	return 0;
}

 

 

이렇게 입출력이 따로 나오게 되버린다

 

 

 

 

백준 채점 방식

백준에서는 입력과 출력을 별도로 분리하고 있어 "출력문"만 채점 파일과 동일하면 되기 때문에 굳이 매번 출력 할 필요가 없다.

 

즉, 출력문만 동일하면 되기 때문에 굳이 입력 후에 해당 값을 매 번 출력 해줄 필요가 없다. 즉, 매번 출력을 flushing 시키지 않고 나중에 한 번에 비우도록 하는 것이다.

 

 

 

 

 

 

백준 15552번 정답

 

#include <iostream>
 
using namespace std;
 
int main(int argc, char const *argv[]) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int T, a, b;
 
	cin >> T;
	for(int i = 0; i < T; i++) {
		cin >> a >> b;
		cout << a + b << "\n";
	}
 
	return 0;
}

 

 

 

 

 

 

'🏃‍♀️ 코테 연습' 카테고리의 다른 글

[C++] 문자열 문법 정리  (0) 2023.02.23
[C++] 백준 10951번  (0) 2023.02.10
27. N!의 표현법  (0) 2021.06.23
26. 말아톤  (0) 2021.06.19
스터디 1일차  (0) 2021.06.17