-
백준 1874 스택 수열 [C]알고리즘 2023. 1. 14. 17:00
문제
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
풀이
4, 3, 6, 8, 7, 2, 5, 1 과 같은 스택 수열이 있다고 가정해보자.
맨 처음 숫자 4를 만들기 위해서는 [1,2,3,4]를 차례대로 스택에 PUSH해야한다.
S = [1,2,3,4]
그리고 나서 4,3은 차례대로 POP을 하여 스택 수열을 만족시킬 수 있다.
그렇다면, 그 다음 숫자인 6을 만들기 위해서는 [5,6]을 차례대로 스택에 PUSH 해야한다.
S = [1,2,5,6]
그리고나서 6은 POP을 하여 스택 수열을 만족 시킬 수 있다.
그 다음 숫자인 8을 만들기 위해서는 [7,8]을 차례대로 스택에 PUSH 해야한다.
[1,2,5,7,8]
그리고 나서 스택에 있는 수들을 모두 POP을 해주면 우리가 원하는 스택 수열을 만들 수가 있다.
스택에 PUSH하는 순서가 반드시 오름차순 이므로 현재 스택에 PUSH 해야 하는 숫자(아래 코드에서의 cnt)를 지정해놓고 풀이해주면 쉽게 풀이 할 수 있다.
코드
#include<stdio.h> #include<stack> #define LEN 200000 using namespace std; int set[LEN], N, cnt = 1, len = 0; char ans[LEN]; stack<int> S; int main() { int i; scanf("%d", &N); for (i = 0; i < N; i++) { scanf("%d", &set[i]); } cnt = 1; for (i = 0; i < N; i++) { if (S.empty() || S.top() < set[i]) { for (cnt = cnt; cnt <= set[i]; cnt++) { ans[len++] = '+'; S.push(cnt); } ans[len++] = '-'; S.pop(); } else if (S.top() == set[i]) { S.pop(); ans[len++] = '-'; } else { break; } } if (i != N) { printf("NO"); return 0; } for (i = 0; i < len; i++) { printf("%c\n", ans[i]); } return 0; }
'알고리즘' 카테고리의 다른 글
백준 2164 카드2 [C] (0) 2023.02.04 백준 20975 Just Stalling [C] (0) 2023.01.14 백준 4949 균형잡힌 세상 [C] (0) 2023.01.14 백준 20974 Even More Odd Photos [C] (1) 2023.01.14 백준 20973 Uddered but not Herd [C] (0) 2023.01.14