스택 수열

bird.j·2021년 3월 10일
0

백준

목록 보기
54/76

백준 1874


방법1. 스택의 원소와 입력값의 원소 비교하기


n = int(input())
arr = [0 for _ in range(n)]
for i in range(n):
    arr[i] = int(input())

stack = []
k = 1
p = []
flag = 0
for ele in arr:
    if not stack or stack[-1] < ele: # not stack은 스택이 비어있다는 말, stack[-1] == pop.stack 즉 스택의 마지막에 삽입한 원소
        for i in range(k, ele+1):
            stack.append(i)
            p.append('+')
            k = ele + 1  #스택에 넣었던 수는 중복되면 안되므로 기억해줄 k를 설정한다.
        stack.pop()
        p.append('-')
    else: 
        if ele == stack[-1]: 
            stack.pop()
            p.append('-')
        else: 
            flag += 1
    
       
if flag == 0:
    for i in p:
        print(i)
else :
    print("NO")

입력값을 arr에 넣고 arr의 ele와 스택의 원소를 비교한다.

1) 스택의 원소가 없거나 스택의 가장 위의 원소가 ele보다 작으면 ele만큼 수를 넣어준다. 이후 pop
2) ele와 스택의 원소가 같다면 pop.
+와 - 를 넣어줄 p배열을 만들고 연산의 가능여부를 판별해주기 위해 flag를 사용한다.
3) 스택에 원소도 존재하는데 ele보다 스택의 마지막 원소가 더 크다면 pop할 수도, ele만큼 append할 수도 없으니 연산이 되지 않는 경우이므로 flag를 증가시켜준다.

flag가 처음과 같이 0이라면 연산들이 저장되어있는 p배열의 원소를 출력해주고 flag가 변했다면 NO를 출력한다.

스택 구현하기 참고

0개의 댓글