문제
문제 해석
- 1부터 주어진 수 까지 순서대로 스택에 들어갈 때 주어진 수열을 만들 수 있는지 확인 하는 문제이다.
- 예를 들어 3까지 넣는다 가정 할 때 2, 1, 3은 다음과 같이 만들 수 있다.
- 스택에 1, 2를 넣은 후 2번 빼면 2, 1 순서대로 나온다.
- 그 후 3을 스택에 넣었다 빼면 2, 1, 3 수열을 만 들 수 있다.
- 이때 push, pop 의 순서를 출력 하는 문제이다.
알고리즘
- 주어진 수열을 vector 등을 통해 저장 한다.
- 이후 1부터 주어진 수인 N 까지 수를 stack 에 넣으면서 다음 작업을 수행 해 준다.
- 만약 이번에 stack 에 들어갈 수가 수열의 순서에 맞다면 pop 을 해 주고 stack 의 top 과 수열의 다음 순서를 비교하는 과정을 반복 한다.
- 반복 중에 stack 이 비거나 수열의 순서와 stack 의 top 이 같지 않을 때 ( ex)위 그림중 우측에서 stack 의 top 이 1이지만 수열의 순서(1) 이 1이 아니라면 위 반복을 break 하고 다시 stack 에 수를 push 해 준다.
- 모든 과정이 끝났을 때 stack 이 비어 있지 않다면 해당 수열은 만들 수 없는 수열이기 때문에 "NO" 를 출력 해 준다.
- 만약 수열이 비었다면 위 과정에서 push, pop 을 하면서 저장 해 두었던 +, - 를 순서대로 출력 하면 된다.
코드
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int N, vector_i = 0;
int input[100001];
vector<char> ans;
stack<int> st;
int main(){
cin >> N;
for(int i = 0; i < N; i++){
cin >> input[i];
}
for(int i = 1; i <= N; i++){
st.push(i);
ans.push_back('+');
while(!st.empty()){
if(st.top() == input[vector_i]){
vector_i += 1;
st.pop();
ans.push_back('-');
} else {
break;
}
}
}
if(st.size() > 0){
cout << "NO" << '\n';
} else {
for(int i = 0; i < ans.size(); i++){
cout << ans[i] << '\n';
}
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
백준_1463 : 1로 만들기 - C++ (0) | 2023.05.22 |
---|---|
백준_1920 : 수 찾기 - C++ (0) | 2023.05.22 |
백준_1389 : 케빈 베이컨의 6단계 법칙 - C++ (0) | 2023.05.19 |
백준_1260 : DFS 와 BFS - C++ (0) | 2023.05.19 |
백준_1654 : 랜선 자르기 - C++ (0) | 2023.05.19 |