DataStucture_1_06_스택수열(1874)

DataStucture1_06스택수열(1874)

문제

스택 (stack)은 기본적인 자료구조 중 하나로, 컴퓨터 프로그램을 작성할 때 자주 이용되는 개념이다. 스택은 자료를 넣는 (push) 입구와 자료를 뽑는 (pop) 입구가 같아 제일 나중에 들어간 자료가 제일 먼저 나오는 (LIFO, Last in First out) 특성을 가지고 있다.

1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을 작성하라.

입력

첫 줄에 n (1 ≤ n ≤ 100,000)이 주어진다. 둘째 줄부터 n개의 줄에는 수열을 이루는 1이상 n이하의 정수가 하나씩 순서대로 주어진다. 물론 같은 정수가 두 번 나오는 일은 없다.

출력

입력된 수열을 만들기 위해 필요한 연산을 한 줄에 한 개씩 출력한다. push연산은 +로, pop 연산은 -로 표현하도록 한다. 불가능한 경우 NO를 출력한다.

풀이

  • 조건 생각하느라 오래걸렸다
  • for문을 돌려서 input 받도록 했고
  • stack이라는 append 하고 pop 할 list를 만들었다.
  • N부터 1까지 standard 라는 list를 만들어서 while문 조건에 standard가 비었을 때, 그리고 stack이 비었을 때 종료하도록 했다.
  • while문 안에서는 if문이 있다.stack의 끝 값이 input 값인지 비교해서 맞으면 pop 하고,
  • 아니라면 elif 문에서 append 하도록 했다. 여기서 중요한 것은 비교할 때 stack이 비어있는지 아닌지 조건설정하는 것이다. 이게 오래걸렸다.
  • elif 문 에서 추가로 standard 값이 비었을 경우 "NO"를 출력하도록 했다. 이부분이 헷갈렸는데, 즉 어떤 상태냐면, stack이 비었거나 + stack 끝 값이 num이 아닐 경우 + standard 값도 비었을 경우이다.
  • 다시 써도 헷갈리는데, 어쨌든 stack의 끝 값이 비었으며 append할 녀석도 없는 상태이다.

코드

import sys
sys.stdin = open("input.txt", "rt")

def input():
    return sys.stdin.readline().rstrip()

N = int(input())

standard = list(range(N,0,-1))
stack = []
res = []

for i in range(1,N+1):
    num = int(input())
    while standard or stack: # stack 이 비거나 standard가 비었을 경우
        if stack and stack[-1] == num: # stack의 끝값이 num일 경우
            stack.pop()
            res.append('-')
            break

        elif not stack or stack[-1] != num: # stack 이 비거나 stack의 끝 값이 num이 아닐 경우
            if not standard : #standard값이 비었을 경우
                print("NO")
                sys.exit()

            stack.append(standard.pop())
            res.append('+')


        else: 
            print("NO")
            sys.exit()
            
for x in res:
    print(x)

배운 것


이부분에서

원래 이 코드를
if standard != True라고 했는데 이러면 틀리더라...
if not standard 라고 해줘야 standard가 비었는지 아닌지 알더라

코멘트

어우 너무 오래 걸렸고 ;;

좋은 웹페이지 즐겨찾기