IT recording...
[BOJ] 3425 고스택 - python 본문
- 푼 코드
-
더보기
import sys from collections import deque input = sys.stdin.readline def goStack(pList, num): goStack = deque([num]) # 연산 for pL in pList: if pL.split(" ")[0] == "NUM": # 스택 최상위에 저장하기 0 goStack.appendleft(int(pL.split(" ")[1])) elif not goStack: return "ERROR" elif pL == "POP": # 스택 가장 위 숫자 제거하기 1 goStack.popleft() elif pL == "INV": # 첫 번째 수의 부호 바꾸기 1 f = goStack.popleft() f = f * (-1) goStack.appendleft(f) elif pL == "DUP": # 첫 번째 숫자를 하나 더 스택의 최상위에 저장하기 1 goStack.appendleft(goStack[0]) elif len(goStack) == 1: return "ERROR" elif pL == "SWP": # 첫 번째 숫자와 두 번째 숫자 위치 바꾸기 2 # tmp = goStack[0] # goStack[0] = goStack[1] # goStack[1] = tmp goStack[0],goStack[1] = goStack[1],goStack[0] elif pL == "ADD": # 첫 번째 숫자와 두 번째 숫자 더하기 2 result = int(goStack.popleft()) + int(goStack.popleft()) if abs(result) > 10 ** 9: return "ERROR" goStack.appendleft(result) elif pL == "SUB": # 첫 번째 숫자와 두 번째 숫자 빼기 (두 - 첫) 2 result = (-1)* int(goStack.popleft()) + int(goStack.popleft()) if abs(result) > 10 ** 9: return "ERROR" goStack.appendleft(result) elif pL == "MUL": # 첫 번째 숫자와 두 번째 숫자 곱하기 2 result = int(goStack.popleft()) * int(goStack.popleft()) if abs(int(result)) > 10 ** 9: return "ERROR" goStack.appendleft(result) elif pL == "DIV": # 나눈 몫 저장 ex) 13 div -4 = -3 #음수가 한 개 일 경우만 몫이 음수 2 f = int(goStack.popleft()) s = int(goStack.popleft()) if f == 0: return "ERROR" result = divmod(abs(s), abs(f))[0] # 몫 if f * s < 0: result = result * (-1) if abs(int(result)) > 10 ** 9: return "ERROR" goStack.appendleft(result) elif pL == "MOD": # 나눈 나머지 저장 ex) -13 mod 4 = -1, -13 mod -4 = -1 #나머지는 첫 수 부호 따라감 2 f = int(goStack.popleft()) s = int(goStack.popleft()) if f == 0: return "ERROR" result = divmod(abs(s), abs(f))[1] # 나머지 if s < 0: result = result * (-1) if abs(int(result)) > 10 ** 9: return "ERROR" goStack.appendleft(result) else: return "ERROR" if len(goStack) == 1: return goStack[0] return "ERROR" while True: programList = [] while True: programTmp = input().strip() if programTmp == "QUIT": quit() # 종료 if programTmp == "END": break programList.append(programTmp) n = int(input()) for _ in range(n): num = int(input()) print(goStack(programList, num)) print() input() # 빈 줄 읽기
얻어가는 것
- deque
-
popleft, appendleft, len(deq)
- SWAP
goStack[0],goStack[1] = goStack[1],goStack[0]
- 입력받을 때 주의할 점
[Python 문법] 파이썬 입력 받기(sys.stdin.readline)strip(), rstrip(), lstrip()
- runtime error
PS에서의 런타임 에러와 디버깅* 배열 인덱스 접근 오류 * 문자열 끝의 개행문자 등 * 무한루프 등등...
느낀점
"210903"
소요 시간 : 3h
- 알고리즘 적으로 어려운 문제는 아니었지만 생각해야 할 예외들이 많아 쉽지 않은 문제였다.
- 예상치 못한 런타임에러로 무엇이 오류의 원인인지 찾기가 매우 힘들었다. 런타임 오류가 발생했을 때 당황하지 않고 오류의 원인을 찾는 연습을 해야할 것 같다.
- 입력받는 방법에서 개행문자를 신경써야 한다.
- 문제의 조건을 잘 읽고 체크해놓자. (이항 연산자의 경우 연산 순서를 무시해서 틀림)
'Algorithm' 카테고리의 다른 글
[BOJ] 1713 후보 추천하기 - python (0) | 2021.12.02 |
---|---|
[BOJ] 1932 정수 삼각형 - python (0) | 2021.12.02 |
[BOJ] 2098 외판원 순회 - python (1) | 2021.12.02 |
[BOJ] 1062 가르침 - python (0) | 2021.12.02 |
[BOJ] 3055 탈출 - python (0) | 2021.12.02 |
Comments