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

 

우선 모든 입력을 queue를 통해 받아둔 다음에 stack자료형을 통해 만약 순서대로 처리가 가능하다면 순서대로 보내주고 아니라면 queue에 있는 값을 stack에 받고 순서대로 일경우 stack을 pop해주면 된다.

 

 

정답코드

#include <iostream>
#include <stack>
#include <queue>

using namespace std;

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

    queue<int> line;
    stack<int> side;
    int next = 1;

    // 대기열 입력받기
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        line.push(x);
    }

    // 대기열 처리
    while (!line.empty()) {
        if (line.front() == next) {
            // 대기열에서 바로 나갈 수 있을 때
            line.pop();
            next++;
        }
        else { // 대기열에서 바로 나갈 수 없을 때
            
            if (!side.empty() && side.top() == next) {
                // 스택에서 나갈 수 있는 경우
                side.pop();
                next++;
            }
            else {
                // 스택에 push
                side.push(line.front());
                line.pop();
            }
        }
    }

    // 스택에 남아있는 사람들 처리
    while (!side.empty() && side.top() == next) {
        side.pop();
        next++;
    }

    // 모두 순서대로 나갔는지 확인
    if (side.empty()) {
        cout << "Nice" << endl;
    }
    else {
        cout << "Sad" << endl;
    }

    return 0;
}

+ Recent posts