Baekjoon 문제 풀기 (1874번 : 스택 수열) Python

1874번 : 스택 수열

1. 문제읽기


기초적인 스택 문제

스택의 개념은 알고 있었는데 구현이 어려웠다.
스택을 파이썬으로 구현하는 방법이 기억나지 않아서 실패했다..

retry 가 쌓여간다~!!!

2. 제출 코드


나름 포인터를 써서 풀어보려고 했는데, 그냥 스택으로 풀면 되는 문제였다.
다음에 다시 풀어봐야겠다.

제출 못한 실패 코드..

import sys

n = int(sys.stdin.readline().rstrip())

stack = []
for i in range(1, n+1):
	stack.append(i)
# stack = [1, 2, 3, 4, 5, 6, 7, 8]
p = 0  # 포인터
ans = ["+"]

while p != len(stack)-1:
	target = int(sys.stdin.readline().rstrip())
	if stack[p] < target:
		p += 1
		ans.append("+")
	elif stack[p] > target:
		p -= 1
		ans.append("+")
	elif stack[p] == target:
		stack.remove(stack[p])
		p -= 1
		ans.append("-")


if len(stack) != 0:
	print(-1)

else:
	print(ans, sep=' ')

3. 공부할 것


파이썬에서 stack은 리스트로 구현할 수 있다.
push는 append 메소드로, pop은 그냥 pop을 쓰면 된다.
while num <= target 이 코드가 어려웠는데, 복잡하게 생각하지 말고 target 숫자보다 num이 작으면 계속 push해서 넣어줘야하는 거다.
num이 target보다 커지면, 스택의 마지막 숫자가 target과 같은지 확인하고 같다면 꺼내준다.
만약 같지 않다면 스택 구조로 만들 수 없는 숫자이기 때문에 NO를 출력한다.

import sys

n = int(sys.stdin.readline().rstrip())
num = 1
ans = []
stack = []
is_stack = True

for _ in range(n):
    target = int(sys.stdin.readline().rstrip())
    while num <= target:
        stack.append(num)
        ans.append("+")
        num += 1
    if stack[-1] == target:
        stack.pop()
        ans.append("-")
    else:
        is_stack = False

if not is_stack:
    print("NO")
else:
    print(*ans, sep="\n")

댓글남기기