728x90
문제
문제 링크 : https://www.acmicpc.net/problem/3425
3425번: 고스택
각각의 입력값에 대해서, 해당하는 프로그램을 수행한 뒤, 출력값을 출력하면 된다. 출력값이란 스택에 저장되어 있는 숫자이다. 만약, 프로그램 에러가 발생하거나, 모든 수행이 종료됐을 때
www.acmicpc.net
CODE
import sys
input = sys.stdin.readline
def exec(commands, num):
stack = [num]
for cmd in commands:
if cmd[:3] == "NUM":
n = int(cmd[4:])
stack.append(n)
elif not stack:
return "ERROR"
elif cmd == "POP":
stack.pop()
elif cmd == "INV":
stack[-1] *= -1
elif cmd == "DUP":
stack.append(stack[-1])
elif len(stack) == 1:
return "ERROR"
elif cmd == "SWP":
stack[-1], stack[-2] = stack[-2], stack[-1]
elif cmd == "ADD":
temp = stack.pop() + stack.pop()
if abs(temp) > 10 ** 9:
return "ERROR"
stack.append(temp)
elif cmd == "SUB":
temp = -stack.pop() + stack.pop()
if abs(temp) > 10 ** 9:
return "ERROR"
stack.append(temp)
elif cmd == "MUL":
temp = stack.pop() * stack.pop()
if abs(temp) > 10 ** 9:
return "ERROR"
stack.append(temp)
elif cmd == "DIV":
a, b = stack.pop(), stack.pop()
if a == 0:
return "ERROR"
temp = abs(b) // abs(a)
if (a > 0 and b < 0) or (a < 0 and b > 0):
temp = -temp
if abs(temp) > 10 ** 9:
return "ERROR"
stack.append(temp)
elif cmd == "MOD":
a, b = stack.pop(), stack.pop()
if a == 0:
return "ERROR"
temp = abs(b) % abs(a)
if b < 0:
temp = -temp
if abs(temp) > 10 ** 9:
return "ERROR"
stack.append(temp)
else:
return "ERROR"
if len(stack) == 1:
return stack[0]
return 'ERROR'
while True:
commands = []
while True:
cmd = input().strip()
if cmd == "QUIT":
quit()
if cmd == "END":
break
commands.append(cmd)
n = int(input())
for _ in range(n):
num = int(input())
print(exec(commands, num))
print()
input() # 줄바꿈 삭제
풀이
💡 idea
- 명령어를 반복해야 하므로 commands 리스트에 명령어 저장
- 명령어 리스트와 입력값을 함수로 넘겨 명령어 실행!
- 명령어를 처리하는 함수 exec(commands, num)
💡 implementation
cmd에 따라 명령어를 처리하는 if문들 사이에
필요한 만큼의 스택 원소 수가 없다면 "ERROR"를 리턴하도록 elif 문을 삽입하였다
NUM은 필요하지 않고, POP, INV, DUP는 원소가 1개, SWP, ADD, SUB, MUL, DIV, MOD는 원소가 2개가 필요하다
elif cmd == "SWP":
stack[-1], stack[-2] = stack[-2], stack[-1]
파이썬은 swap하기 참 간단하네요 🥴
아직 이 편리함에 적응이 안돼서 swap 기본 제공이려나~~하고 찾아봤는데 이렇게 간단하게 처리가 가능하다니..ㅋㅋ
오타 때문에 계속 틀려서 한참을 고생했습니다 😭😭
알파벳 하나 때문에 시간을 얼마나 잡아 먹은건지...
그래도 초반 코드에서 오타를 고친 건 184ms인데, 시간 줄인 거라도 잘한 거라고 생각하기로😤
결과
728x90
'Baekjoon' 카테고리의 다른 글
[BOJ / 백준] 15686번 치킨 배달 파이썬(Python) 문제 풀이 (1) | 2021.08.01 |
---|---|
[BOJ / 백준] 17088번 등차수열 변환 파이썬(Python) 문제 풀이 (0) | 2021.07.31 |
[BOJ / 백준] 16943번 숫자 재배치 파이썬(Python) 문제 풀이 (0) | 2021.07.26 |
[BOJ / 백준] 16938번 캠프 준비 파이썬(Python) 문제 풀이 (0) | 2021.07.25 |
[BOJ / 백준] 16937번 두 스티커 파이썬(Python) 문제 풀이 (5) | 2021.07.23 |