데이터 공부/Python
[백준] 1874. 스택수열
민몽
2024. 8. 8. 01:25
📖 문제

🔗Link : https://www.acmicpc.net/problem/1874
👀 What I Learned
문제점 : 시간이 오래 걸림 ( 3304ms )
원인 : if, elif 등 분기 구간이 많아 연산량이 많음
연산량을 낭비하지 않도록 for, while 문 적절히 활용하기. 어떻게 처리할지 미리 손코딩으로 구조 짜보기
📖 풀이 과정
# N값 입력
N = int(input())
target_list = []
for _ in range(N): # 타겟 순열 입력
target_list.append(int(input()))
idx = 0
stack = []
i = 1
answer = []
while True:
if not stack: # 스택이 비어있는 경우
stack.append(i) # push 연산
i += 1 # 오름차순이므로 1씩 증가
answer.append("+")
elif stack[-1] == target_list[0]: # 스택의 top값 = 타겟 순열 값
stack.pop(-1) # pop 연산
target_list.pop(0) # 순열리스트에서도 제거
answer.append("-")
elif stack[-1] > target_list[0]: # 스택의 top > target값 인 경우
print("NO") # 불가능하므로 NO 출력
break
else: # stack에 값이 있고 & 타겟 순열값은 아닌 경우
stack.append(i) # push 연산
i += 1
answer.append("+")
if not target_list : # 타겟값 다 맞췄으면
for num in answer: # 출력
print(num, end='\n')
break
📖 Solution
- 입력과 비교를 한번에 처리함
- 순열을 차례로 입력하면서 필요한 만큼만 연산하므로 시간 단축 가능 (192ms)
import sys
n = int(sys.stdin.readline())
stack = []
answer = []
flag = 0
cur = 1
for i in range(n):
num = int(sys.stdin.readline())
while cur <= num: # 입력한 수 만날 때 까지 오름차순으로 push
stack.append(cur)
answer.append("+")
cur += 1
# 입력한 수를 만나면 while문 탈출.
# cur = num일때까지 while문으로 스택을 쌓는다.
if stack[-1] == num: # stack의 Top이 입력한 값과 같다면
stack.pop() # stack의 top을 꺼내 수열을 만들어 준다.
answer.append("-")
else:
print("NO")
flag = 1
break
# stack의 top이 입력한 수가 아니면 주어진 스택을 만들 수 없다.
# 스택은 무조건 오름차순으로 push되기 때문에 top이 num보다 크면
# 원하는 순열을 만들 수 없다.
if flag == 0: # 순열을 만들 수 있는 경우
for i in answer:
print(i)