알고리즘

스택 수열

pororo 2026. 5. 31. 22:16
수열 A는 1부터 N까지의 수를 하나씩만 사용하여 만들어진 길이 N의 수열이다.
N=3의 경우 A는 123, 132, 213, 231, 312, 321과 같이 여섯 종류가 존재한다.
정수 N과 수열 A 가 주어졌을 때, 수열 A를 스택을 이용하여 1부터 N까지 오름차순으로 (N=3인 경우 123) 만드는 방법을 출력하는 프로그램을 작성하자.

만약 N=3,\ A=321인 경우,
push (스택에 A_1=3을 삽입한다)
push (스택에 A_2=2를 삽입한다)
push (스택에 A_3=1을 삽입한다)
pop (스택의 top에 있는 값인 1을 출력한다)
pop (스택의 top에 있는 값인 2을 출력한다)
pop (스택의 top에 있는 값인 3을 출력한다)

순서로 진행하면 123이 순서대로 만들어진다.

#include <iostream>
#include <vector>
#include <stack>
#include <string>

using namespace std;

int main() {
    

    int n;
    cin >> n;

    string input_seq;
    cin >> input_seq;

    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        a[i] = input_seq[i] - '0';
    }

    stack<int> s;
    vector<string> operations;
    int expected = 1;

    for (int i = 0; i < n; i++) {
        s.push(a[i]);
        operations.push_back("push");

        while (!s.empty() && s.top() == expected) {
            s.pop();
            operations.push_back("pop");
            expected++;
        }
    }

    if (!s.empty()) {
        cout << -1 << "\n";
    }
    else {
        for (int i = 0; i < operations.size(); i++) {
            cout << operations[i] << "\n";
        }
    }

    return 0;
}

일단 수열의 길이를 정하고 그 수열이 어떻게 있는지 string을 이용해서 입력 받은뒤 그걸 vector를 이용해서 하나씩 쪼개어 저장 한뒤 int expected를 만들어 어떤 값을 찾아야하는지 정한다. 그 후 while문을 돌며 값을 찾고 값이 가능 하다면 pop을 vector에 저장 한다 그후 들어온 값을 for문을 이용하여 출력 한다. 

'알고리즘' 카테고리의 다른 글

장기2  (0) 2026.06.01
안전영역  (0) 2026.05.31
피자데이  (0) 2026.05.30
도서관(Library 2)  (0) 2026.05.30
회의실 배정  (0) 2026.05.23