BOJ 1874. μ€ν μμ΄
πββοΈ[Silver II] μ€ν μμ΄ - 1874
μ±λ₯ μμ½
λ©λͺ¨λ¦¬: 2948 KB, μκ°: 20 ms
λΆλ₯
μλ£ κ΅¬μ‘°, μ€ν
μ μΆ μΌμ
2023λ 12μ 17μΌ 15:52:50
λ¬Έμ μ€λͺ
μ€ν (stack)μ κΈ°λ³Έμ μΈ μλ£κ΅¬μ‘° μ€ νλλ‘, μ»΄ν¨ν° νλ‘κ·Έλ¨μ μμ±ν λ μμ£Ό μ΄μ©λλ κ°λ μ΄λ€. μ€νμ μλ£λ₯Ό λ£λ (push) μ ꡬμ μλ£λ₯Ό λ½λ (pop) μ κ΅¬κ° κ°μ μ μΌ λμ€μ λ€μ΄κ° μλ£κ° μ μΌ λ¨Όμ λμ€λ (LIFO, Last in First out) νΉμ±μ κ°μ§κ³ μλ€.
1λΆν° nκΉμ§μ μλ₯Ό μ€νμ λ£μλ€κ° λ½μ λμ΄λμμΌλ‘μ¨, νλμ μμ΄μ λ§λ€ μ μλ€. μ΄λ, μ€νμ pushνλ μμλ λ°λμ μ€λ¦μ°¨μμ μ§ν€λλ‘ νλ€κ³ νμ. μμμ μμ΄μ΄ μ£Όμ΄μ‘μ λ μ€νμ μ΄μ©ν΄ κ·Έ μμ΄μ λ§λ€ μ μλμ§ μλμ§, μλ€λ©΄ μ΄λ€ μμλ‘ pushμ pop μ°μ°μ μνν΄μΌ νλμ§λ₯Ό μμλΌ μ μλ€. μ΄λ₯Ό κ³μ°νλ νλ‘κ·Έλ¨μ μμ±νλΌ.
μ λ ₯
첫 μ€μ n (1 β€ n β€ 100,000)μ΄ μ£Όμ΄μ§λ€. λμ§Έ μ€λΆν° nκ°μ μ€μλ μμ΄μ μ΄λ£¨λ 1μ΄μ nμ΄νμ μ μκ° νλμ© μμλλ‘ μ£Όμ΄μ§λ€. λ¬Όλ‘ κ°μ μ μκ° λ λ² λμ€λ μΌμ μλ€.
μΆλ ₯
μ λ ₯λ μμ΄μ λ§λ€κΈ° μν΄ νμν μ°μ°μ ν μ€μ ν κ°μ© μΆλ ₯νλ€. pushμ°μ°μ +λ‘, pop μ°μ°μ -λ‘ νννλλ‘ νλ€. λΆκ°λ₯ν κ²½μ° NOλ₯Ό μΆλ ₯νλ€.
</br>
πνμ΄
μ΄ λ¬Έμ λ₯Ό ν λ queue, stackμ μ΄μ©ν΄μ νμλ€.
μ€νμμ popμ ν΄μ νΉμ ν μμ΄μ λ§λ€μ΄μΌνλλ° μλ₯Όλ€μ΄
{ 4 3 6 8 7 5 2 1 }
μ΄λΌλ μμ΄μ λ§λ€μ΄μΌνλ€κ³ κ°μ νμ.
μ μμ΄μ λ§λ€κΈ° μν΄μλ μλμ κ°μ κ³Όμ μ κ±°μ³μΌνλ€.
1
1, 2
1, 2, 3
1, 2, 3, 4
1, 2, 3
1, 2
1, 2, 5
1, 2, 5, 6
1, 2, 5
1, 2, 5, 7
1, 2, 5, 7, 8
1, 2, 5, 7
1, 2, 5
1, 2
1
νμ΄λ μ½λμ μ£ΌμμΌλ‘ μ€λͺ !
int n;
stack<int> s;
queue<int> q;
vector<char> ans;
void solve()
{
cin >> n;
int temp;
// queueμ λ§λ€μ΄μΌνλ μμ΄μ λ£μ΄μ€λ€.
for (int i = 1; i <= n; ++i)
{
cin >> temp;
q.push(temp);
}
int pos = 1; // νμ¬ κ°λ₯΄ν€λ μμΉμ΄μ κ°μ λνλΈλ€.
while (!q.empty()) // μνλ μμ΄μ΄ λμ¬ λ κΉμ§
{
if (!s.empty() && s.top() == q.front()) // μνλ μμ΄μ λΆλΆμ΄ λμ€λ κ²½μ°
{
s.pop();
q.pop();
ans.push_back('-');
}
else if (pos <= q.front()) // μμ κ²½μ°κ° μλλΌλ©΄ μνλ λΆλΆμ΄ λμ¬ λκΉμ§ pushλ₯Ό ν΄μΌνλ€.
{
while (pos <= q.front())
{
s.push(pos++);
ans.push_back('+');
}
}
else // μμ κ²½μ°κ° μλλ€λ©΄ λ§λ€ μ μλ 쑰건μ΄λ―λ‘ NOλ₯Ό μΆλ ₯νκ³ λλΈλ€.
{
cout << "NO";
return;
}
}
for (int i = 0; i < ans.size(); ++i)
cout << ans[i] << '\n';
}
πμ 체 μ½λ
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
int n;
stack<int> s;
queue<int> q;
vector<char> ans;
void solve()
{
cin >> n;
int temp;
for (int i = 1; i <= n; ++i)
{
cin >> temp;
q.push(temp);
}
int pos = 1;
while (!q.empty())
{
if (!s.empty() && s.top() == q.front())
{
s.pop();
q.pop();
ans.push_back('-');
}
else if (pos <= q.front())
{
while (pos <= q.front())
{
s.push(pos++);
ans.push_back('+');
}
}
else
{
cout << "NO";
return;
}
}
for (int i = 0; i < ans.size(); ++i)
cout << ans[i] << '\n';
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}