백준 실4 문제 10828, 스택을 풀다가 깨달은 점들 정리.
N = int(input())
stack = []
for _ in range(N):
order = input()
try:
if "push" in order:
stack.append(int(order[5:]))
elif order == "top":
print(stack[-1])
elif order == "size":
print(len(stack))
elif order == "pop":
print(stack.pop())
elif order == "empty":
if len(stack) == 0:
print(1)
else:
print(0)
except:
print(-1)
1.
input()을 솔직히 많은 사람들이 백준에 제출한 결과를 보면 쓰고 있는걸 알았지만 제한이 안걸렸기에 그냥 주피터노트북,코랩 환경에서 오류없이 돌아가는 input()으로 실험했고 sys.stdin.readline을 굳이 사용하지 않았다.
하지만 이 문제에서는 시간 초과로 계속 실패했고 결국은 input = sys.stdin.readline 한 줄을 추가하고 나서야 정답처리를 받을 수 있었다. 코딩테스트에서 제출할 경우에는 꼭 저 한 줄을 넣자. (import sys 끼면 두 줄..)
사실 저 한 줄 넣었을 경우에도 오류가 났다. 시간초과도 아니고 코드는 그대로인데 '틀렸습니다' 라길래 정신이 혼미해져서 찾아보니 시스템 상에서 테스트 케이스를 실행할 때 개행문자 \n이 들어가서 계속 오류가 뜨는거라고 하길래
.rstrip() 으로 혹시 모를 개행문자를 삭제 처리했더니 정답을 받았다..
2.
다른 사람들의 대부분 풀이와 내 풀이의 차이.
다른 사람들은 pop, top의 케이스에서 stack이 빈 상태여서 맨 위 원소를 반환하거나 제거 후 반환이 불가능 할 경우 -1을 출력하는 경우를 다시 if/else 문으로 나누어서 구현했다.
하지만 나는 조건문이 너무 많이 들어가는 것을 원하지 않아 try/except를 사용해 그냥 예외 케이스 처리를 한번에 했다.
다른 사람들의 정답에서 거의 이런 케이스를 못봐서 난 당연히 내가 시간복잡도면으로 틀린 짓을 했다고 생각했다.
하지만 구글링 도중
Better to 'try' something and catch the exception or test if it's possible first to avoid an exception?
Should I test if something is valid or just try to do it and catch the exception? Is there any solid documentation saying that one way is preferred? Is one way more pythonic? For example, should ...
stackoverflow.com
해당 글을 보게 되었고, try/excpet가 우세하다는 판정을 받았다. 1승!
아무튼 예외처리 가능할 땐 try/except도 잘 써보자