https://www.acmicpc.net/problem/1874
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
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <algorithm>
using namespace std;
int n;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
stack<int> s;
queue<int> q; // 큐는 수열 입력 받음
string ans; // +,- 로 이루어진 문자열
// 수열을 입력받는다
while (n--)
{
int temp;
cin >> temp;
q.push(temp);
}
int index = 1; // 다음 스택에 들어갈 수
// 반복문 탈출 조건은 큐가 다 비어졌을때 --> 순열이 완성됨을 뜻함
while (!q.empty())
{
if (!s.empty())
{
// 스택과 큐의 top,front가 같지 않다면 스택에 뭔가 조치를 취해야한다
if (s.top() != q.front())
{
// 보통의 경우에는 스택에 push를 더 해줘서 같게 해야한다
// 그런데 스택에 push를 해서 더 이상 수열을 만들 수 없을때는 NO를 출력하고 프로그램 종료
// 나는 다음 스택에 넣을 숫자가 큐의 맨 앞부분보다 크면이라고 조건을 설정
// 만약 예제처럼 1, 2, 5, 3, 4 일때
// push 1, pop 1, push 2, pop 2, push 3, push 4, push 5 , pop 5
// 하면 다음 스택에 넣을 index는 6으로 설정되어있고 큐의 front는 3이다
// 일단 숫자를 더 넣을 수 없다는건 알거고 현재 스택의 top은 4라서 어떤 조치를 취할 수 없기에
// NO 출력후 리턴
if (index > q.front())
{
cout << "NO";
return 0;
}
s.push(index++);
ans += '+';
}
// 현재 스택의 맨 위 부분이 큐의 맨 앞부분이 일치하면 스택,큐 pop
else
{
s.pop();
q.pop();
ans += '-';
}
}
else
{
// 스택이 비어있을때는 그냥 push 한다 -> 비어있을때 top을 방지하기 위해
s.push(index++);
ans += '+';
}
}
int len = ans.size();
for (int i = 0; i < len; i++)
cout << ans[i] << '\n';
return 0;
}
어 일단 내 생각을 코드안에 주석으로 써놓긴했는데 이게 남들한테는 이해가 잘 갈지 모르겠다 ㅋㅋ
NO를 출력하고 종료하는 그 조건만 잘 이해하면 쉬울 것 같다
'알고리즘 문제 > C++' 카테고리의 다른 글
[C++] 백준 1966번: 프린터 큐 (0) | 2022.09.08 |
---|---|
[C++] 백준 2108번: 통계학 (2) | 2022.09.05 |
[C++] 백준 11866번: 요세푸스 문제 0 (0) | 2022.08.30 |
[C++] 백준 1181번 : 단어 정렬 (0) | 2022.08.23 |
알고리즘 문제 풀다가 발견한 STL 함수 (0) | 2022.08.22 |