<문제>
<Code>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
int main(){
int n; //n개의 수를 입력 받음
int number; //입력받을 정수
int s=1; //임시 수열
stack<int> st;
queue<int> que;
vector<char> result; //'-'와 '+'를 출력하기 위한 벡터
cin>>n; //8
for(int i=0; i<n; i++){
cin>>number;
que.push(number);
}
while(que.size()){
if(s<=que.front()){
while(s<=que.front()){
st.push(s++);
result.push_back('+');
}
}else if(que.front()==st.top()){
if(st.size()){
st.pop();
que.pop();
result.push_back('-');
}
}else{
cout<<"NO"<<"\n";
return 0;
}
}
for(auto c: result){
cout<<c<<'\n';
}
return 0;
}
이게 초기 코드인데 여기서 한참을 헤맸다. 예제1을 입력하면 마지막에 '-' 세번이 덜 출력, 예제2를 입력하면 NO가 아니라 '+-+-+++' 가 출력된다.
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
int main(){
int n; //n개의 수를 입력 받음.
int number; //입력받을 정수.
int s=1; //임시 수열
stack<int> st;
queue<int> que;
vector<char> result; //'-'와 '+'를 출력하기 위한 벡터
cin>>n; //8
//stack, queue에 다 넣음.
for(int i=0; i<n; i++){
cin>>number;
st.push(number);
que.push(number);
//cout<<number<<endl;
}
for(int i=0; i<n; i++){
if(que.size()){
if(s<=que.front()){
while(s<=que.front()){
st.push(s++);
result.push_back('+');
}
}else if(que.front()==st.top()){
st.pop();
que.pop();
result.push_back('-');
}else{
cout<<"NO"<<"\n";
}
}
}
for(auto c: result){
cout<<c<<'\n';
}
return 0;
}
<Comment>
1. queue에 다 넣음.
2. 입력받은 수<=queue의 front까지 수열 증가시키고 stack에 push
3. 증가시키다가 queue의 front와 stack의 top이 같으면 pop
4. 그 외에는 수열을 만들 수 없는 경우이므로 NO 출력
5. 문자열 출력<algorithm>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
int main(){
int n; //n개의 수를 입력 받음
int number; //입력받을 정수
int s=1; //임시 수열
stack<int> st;
queue<int> que;
vector<char> result; //'-'와 '+'를 출력하기 위한 벡터
cin>>n; //8
for(int i=0; i<n; i++){
cin>>number;
que.push(number);
}
while(que.size()){
if(s<=que.front()){
while(s<=que.front()){
st.push(s++);
result.push_back('+');
}
}else if(que.front()==st.top()){
if(st.size()){
st.pop();
que.pop();
result.push_back('-');
}
}else{
cout<<"NO"<<"\n";
return 0;
}
}
for(auto c: result){
cout<<c<<'\n';
}
return 0;
}
이게 초기 코드인데 여기서 한참을 헤맸다. 예제1을 입력하면 마지막에 '-' 세번이 덜 출력, 예제2를 입력하면 NO가 아니라 '+-+-+++' 가 출력된다.
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
int main(){
int n; //n개의 수를 입력 받음.
int number; //입력받을 정수.
int s=1; //임시 수열
stack<int> st;
queue<int> que;
vector<char> result; //'-'와 '+'를 출력하기 위한 벡터
cin>>n; //8
//stack, queue에 다 넣음.
for(int i=0; i<n; i++){
cin>>number;
st.push(number);
que.push(number);
//cout<<number<<endl;
}
for(int i=0; i<n; i++){
if(que.size()){
if(s<=que.front()){
while(s<=que.front()){
st.push(s++);
result.push_back('+');
}
}else if(que.front()==st.top()){
st.pop();
que.pop();
result.push_back('-');
}else{
cout<<"NO"<<"\n";
}
}
}
for(auto c: result){
cout<<c<<'\n';
}
return 0;
}

<Comment>
1. queue에 다 넣음.
2. 입력받은 수<=queue의 front까지 수열 증가시키고 stack에 push
3. 증가시키다가 queue의 front와 stack의 top이 같으면 pop
4. 그 외에는 수열을 만들 수 없는 경우이므로 NO 출력
5. 문자열 출력
생각보다 시간이 너무 오래 걸렸다. 열심히 해야겠다.
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
'Problem Solving > 백준' 카테고리의 다른 글
[백준-1436] 영화감독 숌 (0) | 2021.05.01 |
---|---|
[백준-2750] 수 정렬하기 (0) | 2021.04.30 |
[백준-10773] 제로 (0) | 2021.03.24 |
[백준-1158] 요세푸스 문제 (0) | 2021.03.22 |
[백준-10845] 큐 (0) | 2021.03.17 |