#include <iostream>
#include <vector>
#include <sstream>
#include <queue>
using namespace std;
int main() {
int n;
cin >> n;
cin.ignore();
queue<int> que;
vector<string> cmds;
for (int i = 0; i < n; i++) {
string cmd;
getline(cin, cmd);
cmds.push_back(cmd);
}
for (string cmd : cmds) {
if (cmd == "pop") {
if (que.empty()) {
cout << "-1\n";
} else {
cout << que.front() << "\n";
que.pop();
}
}
else if (cmd == "size") {
cout << que.size() << "\n";
}
else if (cmd == "empty") {
if (que.empty()) {
cout << "1\n";
} else {
cout << "0\n";
}
}
else if (cmd == "front") {
if (que.empty()) {
cout << "-1\n";
} else {
cout << que.front() << "\n";
}
}
else if (cmd == "back") {
if (que.empty()) {
cout << "-1\n";
} else {
cout << que.back() << "\n";
}
}
else {
stringstream ss(cmd);
string c, data;
ss >> c >> data;
que.push(stoi(data));
}
}
}
💥 원인
- getline + stringstream + stoi 사용으로 명령마다 파싱 오버헤드 발생
💡 개선점
push 1234이런 명령어 처리 하려면 string을 공백 기준으로 구분하면 될 거라 생각했는데, 그냥 cin으로 cmd만 받고 cmd가 push라면 if문 안에서 또 cin 입력 받으면 됨if (cmd == "push") { int data; cin >> data; }
💡 입출력 시간 단축
ios::sync_with_stdio(false)
- C++ iostream과 C의 stdio(stdin/stdout) 사이 동기화를 해제
- cin/cout 자체가 훨씬 빨라짐
cin.tie(nullptr)
- 기본적으로 cin은 cout에 묶여 있어, cin으로 입력 받기 전에 cout이 자동으로 flush됨
- flush
: 출력 버퍼에 쌓인 데이터를 즉시 실제 목적지(터미널, 파일 등)로 내보내고 버퍼를 비우는 동작- tie를 끊으면 이 자동 flush가 사라짐
⇒ 입력-출력을 번갈아 많이 할 때 성능 향상
#include <iostream>
#include <vector>
#include <sstream>
#include <queue>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
cin.ignore();
queue<int> que;
for (int i = 0; i < n; i++) {
string cmd;
cin >> cmd;
if (cmd == "push") {
int data;
cin >> data;
que.push(data);
}
else if (cmd == "pop") {
if (que.empty()) {
cout << "-1\n";
} else {
cout << que.front() << "\n";
que.pop();
}
}
else if (cmd == "size") {
cout << que.size() << "\n";
}
else if (cmd == "empty") {
if (que.empty()) {
cout << "1\n";
} else {
cout << "0\n";
}
}
else if (cmd == "front") {
if (que.empty()) {
cout << "-1\n";
} else {
cout << que.front() << "\n";
}
}
else if (cmd == "back") {
if (que.empty()) {
cout << "-1\n";
} else {
cout << que.back() << "\n";
}
}
}
}