# 문제
# 풀이
1~N까지의 숫자를 차례대로 스택에 push 또는 pop하여 수열을 만들 수 있는지 확인하는 문제였다.
주어진 수가 현재 스택에 넣어진 수가 아닌지 확인하며 주어진 수까지는 스택에 꾸준히 push시킨다.
핵심 포인트는 pop을 하는 상황인데, pop은 무조건 스택의 최상위의 숫자만 할 수 있기때문에 해당 조건을 통해서 검사해야한다.
# 실패한 풀이
import sys
PLUS = "+"
MINUS = "-"
# 실패 코드
def get_top(stack):
stack_len = len(stack)
if stack_len == 0:
return 0
return stack[stack_len-1]
def get_start(stack):
if len(stack) == 0 :
return 0
return stack[0]
def not_solve(n,seq):
default = [i for i in range(1,n+1)]
stack = []
result = []
for seq_num in seq:
print(result)
if get_start(default) < seq_num:
while True:
if len(default) == 0 :
continue
pop = default.pop(0)
stack.append(pop)
result.append(PLUS)
if pop == seq_num:
stack.pop()
result.append(MINUS)
break
elif get_start(default) > seq_num:
if get_top(stack) == seq_num:
stack.pop()
result.append(MINUS)
else:
return "NO"
elif len(default) == 0:
if seq_num == get_top(stack):
stack.pop()
result.append(MINUS)
else:
return "NO"
return result
생각했던 것을 코드로 옮기다 보니 너무너무 복잡해졌다. 코드의 가독성이 떨어지고, 무엇보다 어떠한 자료구조를 사용할것인지에 대한고민보다는 무작정 코드를 썼던 것이 패인이 된 것 같다.
코드가 복잡해지다보니까 런타임에러가 일어났고, 디버깅하는 것 보다 다시 짜는게 좋을 것 같다는 생각에 차근히 생각해보면서 다시 풀었다.
# 정답 코드
import sys
PLUS = "+"
MINUS = "-"
# 정답 코드
def solve(n,seq):
count = 1
stack = []
result = []
for i in range(n):
data = seq.pop(0)
while count <= data:
stack.append(count)
result.append(PLUS)
count+=1
if stack[-1] == data:
stack.pop()
result.append(MINUS)
else:
return "NO"
return result
if __name__ == '__main__':
n = int(sys.stdin.readline().strip())
seq = []
for i in range(n):
seq.append(int(sys.stdin.readline().strip()))
a = solve(n,seq)
if a == "NO":
print(a)
else:
for i in a:
print(i)
# 마치며
'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글
[백준-5397] 키로거 파이썬 (0) | 2022.08.05 |
---|---|
[백준-1966] 프린터 큐 파이썬 (0) | 2022.08.05 |
[백준-2798] 블랙잭 파이썬, 3중 반복문 사용 (0) | 2022.08.03 |
[백준-2920] 음계 파이썬, 오름차순 내림차순 판단하기 (0) | 2022.08.03 |
[백준-9663] N-Queen 파이썬, 백트랙킹, 파이썬 전역변수, enumerate (0) | 2022.08.03 |