알고리즘 모음(C++)

백준 1874 - 스택 수열(복습) 본문

백준

백준 1874 - 스택 수열(복습)

공대생의 잡다한 사전 2021. 7. 1. 00:31

문제 링크입니다 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

스택(stack)이란 기본적인 자료구조로 한쪽 끝에서만 자료를 넣고 뺄수 있는 LIFO(last in first out) 형식을 따릅니다.

 

스택 push, pop등 다양한 연산을 사용할 수 있습니다.

  • push(num) -> num을 가장 위에 하나 추가한다.
  • pop()        -> 가장 위에 있는 항목을 제거한다.
  • peek()       -> 가장 위에 있는 항목을 반환한다.
  • empty()     -> 스택이 비어있을때 false를 반환합니다.

1부터 n까지의 수를 스택에 입력했을때 연산을 이용해 원하는 수열을 만들 수 있는지 확인하는 문제입니다.

1부터 8까지의 수를 입력했을때 4 3 6 8 7 5 2 1의 수열을 만들고 싶다고 하면

+ + + + - - + + - + + - - - - -(+ -> push,  - -> pop) 와 같은 연산을 하면 만들 수 있습니다.

 

코드는 간단합니다. 

1. i를 push합니다(i는 1부터N까지 순서대로 증가)

2. 입력한 값이 원하는 수열의 첫번째 숫자와 같다면 pop해줌과 동시에 다음 숫자로 넘어갑니다

3. 1번과 2번을 반복합니다.

 

자세한 것은 코드를 참고해 주세요

 

#define CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>
#include <stack>
using namespace std;

int arr[100001];

int main() {
	cin.tie(0);
	cout.tie(0);
	stack<int> s;
	vector<char> v;
	int num, cnt = 1;
	cin >> num;
	for (int i = 1; i <= num; i++) {
		cin >> arr[i];
	}
	for (int i = 1; i <= num; i++) {
		s.push(i);
		v.push_back('+');
		while (!s.empty() &&  s.top() == arr[cnt]) {
			s.pop();
			v.push_back('-');
			cnt++;
		}
	}
	if (!s.empty()) cout << "NO";
	else {
		for (int i = 0; i < v.size(); i++) {
			cout << v[i] << "\n";
		}
	}
	return 0;
}

 

질문 및 조언 댓글 남겨주세요

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

백준 16235 - 나무 재테크  (0) 2021.07.02
백준 1937 - 욕심쟁이 판다(복습)  (0) 2021.07.01
백준 16953 - A -> B  (0) 2021.06.30
백준 17144 - 미세먼지 안녕!  (0) 2021.06.30
백준 9935 - 문자열 폭발(복습)  (0) 2021.06.28