공부 자료/알고리즘

(Python/파이썬) 백준 1874번 - 스택 수열

뚜루뚜루세니 2021. 8. 19. 13:18
728x90

문제출처: 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

1. 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import sys
= int(sys.stdin.readline())
arr =[]     #입력값 순서대로 담을 배열
stack=[]    #스택으로 활용
ans=[]      #push,pop기록
 
for _ in range(n):
    arr.append(int(input())) #n개 인풋 배열에 저장
 
index = 1
 
for i in range(n):
    if arr[i] >= index:
        while index <= arr[i]:
            stack.append(index)
            ans.append("+")
            index+=1
        stack.pop()
        ans.append('-')
    else:
        if len(stack)!=0 and stack[-1== arr[i]:
            stack.pop()
            ans.append('-')
 
if len(stack) != 0:
    print("NO")
else:
    for i in ans:
        print(i)
cs

2. 해결과정

스택을 이용한 문제였다.

문제 자체의 문장이 이해하기가 좀 어려웠는데, 

입력예시를 살펴보면 4 3 6 8 7 5 2 1 순으로 수열을 받아오는 것을 확인할 수 있다.

순서대로 첫번 째 입력값이 8까지의 숫자를 스택에 넣고 빼면서 위의 배열을 완성시켜주면된다.

1) 각 수열의 값에 도달할 때까지 1부터 차례대로 스택에 넣고 + 기호 기록

2) 입력된 수열 값이 차례대로 넣고 있었던 수보다 작으면 stack 가장 위 해당 수열 값 있는지 찾기

3) 해당 수열값과 같으면 pop -> - 기록 아니라면 NO 출력

 

3. 느낀점

문제를 이해하는 것에서 어려웠다..

728x90