#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
'Problem Solving > 백준' 카테고리의 다른 글
[백준/C++] 2164번 카드2 (0) | 2022.01.26 |
---|---|
[백준/C++] 11866번 요세푸스 문제 0 (0) | 2022.01.26 |
[백준/C++] 1427번 소트인사이드 (0) | 2022.01.26 |
[백준/C++] 11650번 좌표 정렬하기 (0) | 2022.01.24 |
[백준/C++] 10828번 스택 (0) | 2022.01.24 |