https://www.acmicpc.net/problem/24511
24511번: queuestack
첫째 줄에 queuestack을 구성하는 자료구조의 개수 $N$이 주어진다. ($1 \leq N \leq 100\,000$) 둘째 줄에 길이 $N$의 수열 $A$가 주어진다. $i$번 자료구조가 큐라면 $A_i = 0$, 스택이라면 $A_i = 1$이다. 셋째 줄
www.acmicpc.net
문제해석
이걸 그냥 문제설명처럼 구현하면 100000*100000만큼 걸려서 시간초과난다.
스택의 특성상 맨 처음의 있던값은 절대 pop되지않는다.
따라서 큐만 살펴보면되는데 예시의 입력을 그림으로 살펴보자.
아래 부분이 front이다.
초기 상태엔 각 자료구조에 1 2 3 4가 들어있다.
2를 넣고난 후의 상태이다.
마지막에 4가 빠져나온것을 초록색으로 써놨는데 최종 초록색이 답이 된다.
4를 넣고난 후의 상태이다.
7을 넣고난 후의 상태이다.
따라서 답은 4 1 2가 된다.
그림상에서 확인 할 수 있듯이 스택자료구조는 있으나 마나이고 큐만 보면된다.
여러 큐를 하나로 볼수있는데 맨 마지막 큐의 초기값이 front에 위치시킨 하나의 큐로 볼수가 있다.
즉 아래 그림처럼 초기 값이 세팅 되어있다고 생각하면 된다.
그리고 큐에 하나를 푸쉬할때마다 큐의 맨 앞 원소를 팝 해주면 최종적으로 아래 그림처럼 나온다.
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
stack <int> st;
queue <int> q;
bool flag[100000];
int main(){
cout.tie(NULL);
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int n,m,input,x;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>flag[i];
}
for(int i=0; i<n; i++)
{
cin>>input;
if(flag[i]==0)
{
st.push(input);
}
}
while(!st.empty())
{
q.push(st.top());
st.pop();
}
cin>>m;
for(int i=0; i<m; i++)
{
cin>>input;
q.push(input);
}
for(int i=0; i<m; i++)
{
cout<<q.front()<<" ";
q.pop();
}
}
'백준문제풀이' 카테고리의 다른 글
백준 문제 14398번 피타고라스 수 문제풀이 c++ (0) | 2022.03.06 |
---|---|
백준 문제 24513번 좀비 바이러스 c++ (0) | 2022.03.06 |
백준 문제 24509번 상품의 주인은? 문제풀이 c++ (0) | 2022.03.06 |
백준 문제 24510번 시간복잡도를 배운 도도 문제풀이 c++ (0) | 2022.03.06 |
백준 문제 17215번 볼링 점수 계산 문제풀이 c++ (0) | 2022.03.01 |