ProblemSolve

[백준][C++] 2742 기찍 N - 브론즈4 (endl과 \n의 차이)

노루동산 2024. 1. 2. 13:04
반응형

문제 보기

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

 

2742번: 기찍 N

자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

문제                           

 

자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

 

 

입력                          

첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

 

출력                          

첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

 

풀이방법                 

매우 쉬운 문제인데

시간 초과가 났다.

 

이건 내가 C++의 출력에 대해 잘 알지 못했던 탓인데

그게 뭐냐 하면 endl과 '\n'의 차이이다.

 

C#으로도 코딩 테스트 문제를 많이 풀어봤다면

출력이 많을 경우 StringBuilder를 이용해

하나의 string으로 만들어 단 한 번만 출력하는 것으로

시간 단축을 한다는 것을 알고 있을 것이다.

 

이는 출력에 시간이 많이 걸리기 때문인데

endl과 '\n'의 출력 시간 차이가 나는 이유도 비슷하다.

 

cout << "안녕하세요"라고 입력했다고 생각하자.

그러면 우리가 쓴 글자가 버퍼에 담겨 출력되기를 기다리고 있을 것이다.

 

 

여기서 뒤에 endl이 들어간다면

 

버퍼는 바로 비워진다(출력된다)

참고로 이렇게 버퍼가 비워지는 것을 flush라고 한다.

 

그러나 뒤에 오는 것이 \n이라면

개행 문자가 버퍼에 저장 될 뿐, 바로 비워지지 않는다.

 

이렇게 한 번만 처리하면 될 출력이 endl을 사용할 경우 여러 번 이루어지기 때문에

브론즈 4 문제에서도 시간 초과가 걸리게 되는 것이다!

 

 

 

전체 코드

#include <iostream>

using namespace std;

int main()
{
	int N;
	cin >> N;

	for (int i = N; i > 0; i--)
	{
		cout << i << '\n';
	}
	return 0;
}
반응형