본문 바로가기
백준

[1874번] 스택 수열

by 2744m 2019. 3. 15.
1874번: 스택 수열
 
www.acmicpc.net
/*1874번 스택 수열*/
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
stack<int>S;
queue<char>Q;
int N, Arr_pointer = 0, push_num = 1;
int Arr[100000];
int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> N;
	for (int i = 0; i < N; i++) cin >> Arr[i];
	while (Arr_pointer < N) {
		if (S.empty()) {
			S.push(push_num++);
			Q.push('+');
		}
		else {
			if (S.top() == Arr[Arr_pointer]) {
				S.pop();
				Arr_pointer++;
				Q.push('-');
			}
			else {
				if (S.top() > Arr[Arr_pointer]) {
					cout << "NO";
					return 0;
				}
				else {
					S.push(push_num++);
					Q.push('+');
				}
			}
		}
	}
	while (!Q.empty()) {
		cout << Q.front() << '\n';
		Q.pop();
	}
}

조건은 아래와 같다.

1. 스택에 1부터n까지 차례대로 들어간다. 스택에 쌓을 때는 +를 출력한다.

2. 스택의 top이 입력값과 같으면 pop을 하면서 -를 출력한다.

3. 입력값을 만들수 없으면 NO를 출력한다.

이 조건들을 이용해서 풀이과정을 적어보면,

1. 스택에 넣을 숫자를 선언해서 push때 만 값을 1씩 증가시킨다.

2. 입력값의 배열을 가르키는 포인터 변수를 선언해서 조건2에 부합하면 증가시킴

3. push, pop결과를 큐에 저장해서 조건 3에 부합하지 않고 반복문을 빠져나오면 큐에서 하나씩 뽑아서 출력한다.

'백준' 카테고리의 다른 글

[1966번] 프린터 큐  (0) 2019.03.19
[1158번] 조세퍼스 문제  (0) 2019.03.15
[10867번] 중복 빼고 정렬하기  (0) 2019.03.13
[1181번] 단어 정렬  (0) 2019.03.13
[1026번] 보물  (0) 2019.03.12

댓글