- 문제
//시간 제한: 1초, 메모리 제한: 128MB
- 입력
입력의 첫째 줄에는 현재 승환이의 앞에 서 있는 학생들의 수 N(1 ≤ N ≤ 1,000,자연수)이 주어진다.
다음 줄에는 승환이 앞에 서있는 모든 학생들의 번호표(1,2,...,N) 순서가 앞에서부터 뒤 순서로 주어진다.
-출력
승환이가 무사히 간식을 받을 수 있으면 "Nice"(따옴표는 제외)를 출력하고 그렇지 않다면 "Sad"(따옴표는 제외)를 출력한다.
// Created by dongwan-kim on 2022/07/24.
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
int n, num, cnt = 1;
queue<int> q;
stack<int> s;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> num;
q.push(num);
}
while (!q.empty() || !s.empty()) { //q,s 둘 다 비어있는게 아니라면 반복
if (!q.empty()) { //줄에 사람이 있을 때
if (!s.empty() && s.top() == cnt) { //추가 공간 앞사람이 번호 순서에 맞는 경우
s.pop();
cnt++;
} else if (!q.empty() && q.front() == cnt) { //줄에 앞사람이 번호 순서에 맞는 경우
q.pop();
cnt++;
} else { //줄, 추가 공간 앞사람들이 다 번호 순서에 맞지 않는 경우
s.push(q.front());
q.pop();
}
} else { //더이상 줄에 사람이 없을 때
if (!s.empty() && s.top() == cnt) { //추가 공간 앞사람이 번호 순서에 맞는 경우
s.pop();
cnt++;
} else //간식 받기 실페
break;
}
}
if (q.empty() && s.empty()) //모두가 간식을 받은 경우
cout << "Nice";
else //간식을 받지 못한 경우
cout << "Sad";
}
queue와 stack을 사용하여 문제를 해결했다.
입력받는 줄 번호는 q에 push해주었다.
줄에 사람이 있는 경우에 3가지 case로 나누었는데
줄 제일 앞 사람이 번호 순서에 맞는경우, q.pop하고 번호 순서 갱신
추가 공간 제일 앞 사람이 번호 순서에 맞는경우, s.pop하고 번호 순서 갱신
두개 다 아닌 경우, 줄 제일 앞 사람을 추가 공간에 넣어주기(s.push, q.pop)
줄에 사람이 없는 경우에는 2가지 case로 나누었는데
추가 공간 앞 사람이 번호 순서에 맞는 경우, s.pop하고 번호 갱신
추가 공간 앞 사람 번호 순서 맞지 않거나 s가 비어있는 경우 반복문 탈출
위의 반복문을 모두 돌았을 때 q와s 가 모두 비어있으면 간식을 받는거고
비어있지 않다면 간식을 받지 못하는 것이다.
지금 블로그를 작성하다 보니 q는 무조건 empty가 되므로 s.empty여부만 조건문에 적어주었어도 충분해 보인다.