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

1. 풀이방법

 

- 문제 설명이 약간 부족한 감이 있는데, 예시를 보면서 아 이렇게 하라는 거구나 라고 알게 되었습니다.

 

- 1~n까지의 숫자를 보는데 입력으로 들어오는 만들어야되는 것들은 큐에 담아 놓고 앞에서 부터 비교를 했습니다.

 

- 말로 설명이 어려워 아마 코드를 보시면 이해가 쉽게되실듯 합니다.

 

 

2. 주의사항

- 이런류의 문제가 사실 꽤 어렵게 느껴집니다. 개인적으로...

 

- 여러번 풀어봐야 할 것 같습니다.

 

 

3. 나의코드

#include<iostream>
#include<stdio.h>
#include<stack>
#include<queue>
using namespace std;

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int n, tmp;
	cin >> n;
	queue<int> qar; //만들어야하는 결과
	vector<bool> oper; //결과 출력을 위한 +,- 저장벡터
	stack<int> sar; // 만들기 위해 사용할 스택
	for(int i=0;i<n;i++) {
		cin >> tmp;
		qar.push(tmp);
	}
	for (int i = 1; i <= n; i++) {
		if (i == qar.front()) {
			sar.push(i);
			oper.push_back(1);
			sar.pop();
			oper.push_back(0);
			qar.pop();
			while (1) {
				if (sar.empty() == false) {
					if (sar.top() == qar.front()) {
						sar.pop();
							oper.push_back(0);
							qar.pop();
					}
					else { break; }
				}
				else { break; }
			}
		}
		else {
			sar.push(i);
			oper.push_back(1);
		}
	}
	if(sar.empty()==true){
		for (int i = 0; i < oper.size(); i++) {
			if (oper[i] == 1) {
				cout << '+' << '\n';
			}
			else {
				cout << '-' << '\n';
			}
	    }
	}
	else { cout << "NO" << '\n'; }
	return 0;
}

 

'알고리즘 문제풀이 > 스택' 카테고리의 다른 글

백준 1406 [C++]  (0) 2021.01.09
백준 10799 [C++]  (0) 2021.01.09
백준 3986  (0) 2020.03.02
백준 2493  (0) 2020.01.08

+ Recent posts