article thumbnail image
Published 2023. 1. 12. 19:14

문제 설명

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

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

1부터 n까지의 수를 오름차순으로 스택에 넣었다가 뽑아 늘어놓으면서, 주어진 수열과 같게 만들 수 있을지 구하기

 

문제 풀이법

수를 넣었다 뽑을 stack, 주어진 수열을 담을 vector, 연산 과정을 넣어줄 vector가 필요하다

 

우선 주어진 수에 맞게 while문을 돌도록 한다.

단, while문을 한바퀴 돌았다고 해서 idx를 + 1하는 것이 아니라, 주어진 수열(v)의 인덱스의 값과, 스택에서 뽑은 값이 같을 때만 idx를 + 1 한다

스택의 top을 이용해 비교할 것이므로 0을 넣어서 셋팅해준다 (아무것도 없으면 s.top() 자체가 불가능 하기 때문)

  • 만일 스택의 top이 v[idx] 보다 작으면 1부터 오름차순으로 스택에 값을 넣어준다
  • 만일 스택의 top이 v[idx] 보다 크면 현재 스택이 비어있는지, 아니면 초기 상태인 0이 들어있는지 확인하고 pop해준다
  • 만일 스택의 top이 v[idx]와 같다면 pop해준 후, idx + 1 해준다

while문을 돌면서 넣을 수 있는 값이 n보다 크거나, 더 이상 pop 할 수 없을 때는 주어진 수열을 만들 수 없으므로 NO를 출력하고 종료한다

 

소스 코드

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

using namespace std;

int main()
{
    int n;
    
    cin >> n;
    
    stack<int> s;
    vector<int> v;
    vector<char> ans;
    
    for (int i = 0; i < n; i++)
    {
        int tmp;
        cin >> tmp;
        v.push_back(tmp);
    }
    
    int idx = 0;
    int j = 1;
    s.push(0);
    
    while (idx < n)
    {
        if (j > n + 1)
        {
            printf("NO\n");
            return 0;
        }
        
        if (s.top() < v[idx])
        {
            s.push(j);
            ans.push_back('+');
            j++;
        }
        else if (s.top() > v[idx])
        {
            if (s.top() == 0 || s.empty())
            {
                printf("NO\n");
                return 0;
            }
            s.pop();
            ans.push_back('-');
        }
        else
        {
            s.pop();
            ans.push_back('-');
            idx++;
        }
    }
    
    for (int i = 0; i < ans.size(); i++)
    {
        printf("%c\n", ans[i]);
    }
    
}

'Algorithm Study' 카테고리의 다른 글

[백준] 6198 옥상 정원 꾸미기  (0) 2023.01.13
[백준] 2493 탑  (0) 2023.01.12
[백준] 10773 제로  (0) 2023.01.12
[백준] 10828 스택  (0) 2023.01.12
[프로그래머스] 1단계 - 크기가 작은 부분 문자열  (0) 2023.01.11
복사했습니다!