본문 바로가기

Problem Solving/백준

[백준/C++] 큐 2 / queue 구현 / 시간 단축


#include<iostream>
#include<queue>
#include<string>
using namespace std;

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

	int N, num = 0;
	cin >> N;

	string str;
	queue <int> q;

	for (int i = 0; i < N; i++) {
		cin >> str;
		if (str == "pop") {
			if (q.empty())
				cout << -1 << "\n";
			else {
				cout << q.front() << "\n";
				q.pop();
			}
		}
		else if (str == "size")
			cout << q.size() << "\n";
		else if (str == "empty")
			if (q.empty())
				cout << 1 << "\n";
			else
				cout << 0 << "\n";
		else if (str == "front")
			if (q.empty())
				cout << -1 << "\n";
			else
				cout << q.front() << "\n";
		else if (str == "back")
			if (q.empty())
				cout << -1 << endl;
			else
				cout << q.back() << "\n";
		else if (str == "push") {
			cin >> num;
			q.push(num);
		}
	}

	return 0;
}

queue 구현은 Data Structure(데이터 구조) 를 공부하면서 다들 많이들 해보셨을 것이고 돌아가는 메카니즘은 쉽게 이해하고 있을 것이라고 생각합니다.

 

이 문제에서는 C++ 에서 자주 쓰는 endl 보다 '\n'을 쓰는 것이 중요한데 이유는 아래와 같습니다.

  • 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 등을 같이 사용하면 안 됩니다.

참고 링크(reference from jh05013) : https://www.acmicpc.net/board/view/22716 


문제: https://www.acmicpc.net/problem/18258

 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net