[알고리즘] 백준 18258

은개·2025년 10월 8일

[CS] 알고리즘

목록 보기
21/21

백준 18258 - 큐 2

오답 (시간초과)

#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";
            }
        }
    }
}

0개의 댓글