• toc {:toc}

문제

μŠ€νƒ (stack)은 기본적인 자료ꡬ쑰 쀑 ν•˜λ‚˜λ‘œ, 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ 자주 μ΄μš©λ˜λŠ” κ°œλ…μ΄λ‹€. μŠ€νƒμ€ 자료λ₯Ό λ„£λŠ” (push) μž…κ΅¬μ™€ 자료λ₯Ό λ½‘λŠ” (pop) μž…κ΅¬κ°€ κ°™μ•„ 제일 λ‚˜μ€‘μ— λ“€μ–΄κ°„ μžλ£Œκ°€ 제일 λ¨Όμ € λ‚˜μ˜€λŠ” (LIFO, Last in First out) νŠΉμ„±μ„ κ°€μ§€κ³  μžˆλ‹€.

1λΆ€ν„° nκΉŒμ§€μ˜ 수λ₯Ό μŠ€νƒμ— λ„£μ—ˆλ‹€κ°€ 뽑아 λŠ˜μ–΄λ†“μŒμœΌλ‘œμ¨, ν•˜λ‚˜μ˜ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€. μ΄λ•Œ, μŠ€νƒμ— pushν•˜λŠ” μˆœμ„œλŠ” λ°˜λ“œμ‹œ μ˜€λ¦„μ°¨μˆœμ„ 지킀도둝 ν•œλ‹€κ³  ν•˜μž. μž„μ˜μ˜ μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μŠ€νƒμ„ μ΄μš©ν•΄ κ·Έ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ μ—†λŠ”μ§€, μžˆλ‹€λ©΄ μ–΄λ–€ μˆœμ„œλ‘œ push와 pop 연산을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€. 이λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯

첫 쀄에 n (1 ≀ n ≀ 100,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ 쀄뢀터 n개의 μ€„μ—λŠ” μˆ˜μ—΄μ„ μ΄λ£¨λŠ” 1이상 nμ΄ν•˜μ˜ μ •μˆ˜κ°€ ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€. λ¬Όλ‘  같은 μ •μˆ˜κ°€ 두 번 λ‚˜μ˜€λŠ” 일은 μ—†λ‹€.

좜λ ₯

μž…λ ₯된 μˆ˜μ—΄μ„ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ 연산을 ν•œ 쀄에 ν•œ κ°œμ”© 좜λ ₯ν•œλ‹€. push연산은 +둜, pop 연산은 -둜 ν‘œν˜„ν•˜λ„λ‘ ν•œλ‹€. λΆˆκ°€λŠ₯ν•œ 경우 NOλ₯Ό 좜λ ₯ν•œλ‹€.

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

풀이

NOκ°€ λ‚˜μ˜€λŠ” 상황뢀터 μ ‘κ·Όν•΄μ„œ μΌ€μ΄μŠ€ λΆ„λ¦¬ν•˜κΈ° μ‹œμž‘ν–ˆλ‹€.

λ‹€λ§Œ val == k μΌλ•Œμ˜ μΌ€μ΄μŠ€λ₯Ό 놓쳀닀.

λ‚˜ 슀슀둜 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μ„€μ •ν•΄μ„œ 경우의 수λ₯Ό λ”°μ Έλ³΄λŠ” νž˜μ„ κΈΈλŸ¬μ•Ό 함.

++ topμ΄λ‚˜ popλ₯Ό μ‚¬μš©ν•  λ•Œ empty상황을 μ˜ˆμ™Έμ²˜λ¦¬ μ•ˆν•΄μ£Όλ©΄ λŸ°νƒ€μž„μ—λŸ¬ λ°œμƒν•˜λŠ” 것 λͺ…μ‹¬ν•˜κΈ°

#include <bits/stdc++.h>
 
using namespace std;
 
int N, k=1;
string str = "";
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie();
    stack<int> s;
    
    cin >> N;
    while(N--){
        int val;
        cin >> val;
        if(val > k){
            while(k <= val){
                str += "+\n";
                s.push(k++);
            }
            str += "-\n";
            s.pop();
        }
        else if(val == k){
            str += "+\n";
            str += "-\n";
            k++;
        }
        else{
            if(s.empty()) continue;
            if(val != s.top()){
                cout << "NO\n";
                return 0;
            }
            else{
                str += "-\n";
                s.pop();
            }
        }
    }
    cout << str;
}