https://www.acmicpc.net/problem/12789
12789번: 도키도키 간식드리미
인하대학교 학생회에서는 중간, 기말고사 때마다 시험 공부에 지친 학우들을 위해 간식을 나눠주는 간식 드리미 행사를 실시한다. 승환이는 시험 기간이 될 때마다 간식을 받을 생각에 두근두
www.acmicpc.net
스택을 하나 이용해서 주어진 N개의 수들을 순서대로(오름차순) 만들 수 있는지를 판단하는 문제다.
줄서있는 사람의 차례인 경우 통과시키고
차례가 아닌 경우 스택에 집어넣는다.
스택에 쌓다보면, 현재 차례인 사람을 1)줄 서있는사람, 2)스택에 쌓인사람 두 경우 모두 비교해줘야한다.
둘 중 한명의 차례라면 그대로 내보내면 되고, 둘 다 아닌 경우엔 일단 스택에 넣어주는 수밖에 없다.
#include <iostream>
#define fio cin.tie(0)->sync_with_stdio(0)
using namespace std;
#include <queue>
#include <stack>
int main(){
fio;
int N; cin >> N;
queue<int> standing;
for(int i=0; i < N; i++){
int tmp; cin >> tmp;
standing.push(tmp);
}
stack<int> wait;
int ack = 1;
while(!standing.empty()){
if(standing.front() == ack){//줄 선 사람이 차례면
standing.pop();
ack++;
}else{//줄 선 사람 차례가 아니면, 옆 대기선을 본다
if(!wait.empty()){//옆 대기선이 안비었으면확인해보자
if(wait.top() == ack){
wait.pop();
ack++;
}else{
wait.push(standing.front());
standing.pop();
}
}else{//옆 대기선 비어있다.
wait.push(standing.front());
standing.pop();
}
}
}
while(!wait.empty() && ack == wait.top()){
wait.pop();
ack++;
}
if(wait.empty())
cout << "Nice";
else
cout << "Sad";
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1662 압축 (0) | 2021.12.25 |
---|---|
백준 14713 앵무새 (0) | 2021.12.24 |
백준 18100 Думский регламент (0) | 2021.12.24 |
백준 15815 천재 수학자 성필 (0) | 2021.12.24 |
백준 11899 괄호 끼워넣기 (0) | 2021.12.23 |