백준 3425 - 고스택 파이썬 풀이
[문제 링크]
https://www.acmicpc.net/problem/3425
[입출력 예]
[입력]
DUP
MUL
NUM 2
ADD
END
3
1
10
50
NUM 1
NUM 1
ADD
END
2
42
43
NUM 600000000
ADD
END
3
0
600000000
1
QUIT
[출력]
3
102
2502
ERROR
ERROR
600000000
ERROR
600000001
[소스코드]
from sys import stdin
def solution(queries, stack):
#5. MAX값 정하기
MAXVAL = 10 ** 9
for query in queries:
# 6. try..except로 처리.
# except에는 오류를 구체화할 수 있지만
# 아무것도 안 줄 경우 모든 에러를 받아줌.
# raise는 에러를 강제로 발생시키는 코드
# 연산이 다 끝났을 때 값이 1개가 아니거나
# 연산 결과 최대값을 넘어가면 에러이다. 0으로 나누는 경우도
# 최대값을 넘기는 에러에 포함이 된다.
# 결과는 항상 stack[-1]을 참조하면 된다.
try:
if query.startswith('NUM'):
stack.append(int(query.replace('NUM ', '')))
else:
if query == 'POP':
stack.pop()
elif query == 'INV':
stack.append(-stack.pop())
elif query == 'DUP':
stack.append(stack[-1])
elif query == 'SWP':
stack[-1], stack[-2] = stack[-2], stack[-1]
elif query == 'ADD':
stack.append(stack.pop() + stack.pop())
elif query == 'SUB':
f, s = stack.pop(), stack.pop()
stack.append(s - f)
elif query == 'MUL':
stack.append(stack.pop() * stack.pop())
elif query == 'DIV':
f, s = stack.pop(), stack.pop()
# 두 수중 한 수가 음수일 때는 음수 몫을 저장
r = abs(s) // abs(f)
if (0 < f and s < 0) or (f < 0 and 0 < s):
r = -r
stack.append(r)
elif query == 'MOD':
f, s = stack.pop(), stack.pop()
r = abs(s) % abs(f)
if s < 0:
r = -r
stack.append(r)
if stack and MAXVAL < abs(stack[-1]):
raise
except:
return 'ERROR'
if len(stack) != 1:
return 'ERROR'
return stack[0]
while True:
#1. queries: 입력 한 세트이다.
queries = [stdin.readline().strip()]
if queries[0] == 'QUIT':
break
while True:
#2. END가 나올 때 까지 명령어를 리스트에 저장
if queries[-1] == 'END':
break
query = stdin.readline().strip()
queries.append(query)
#3. 시작값을 받고, queries와 초기스택을 넣어서 함수를 실행
for _ in range(int(stdin.readline())):
val = int(stdin.readline())
print(solution(queries, [val]))
#4. queries 중간 중간에 있는 공백 제거
stdin.readline().strip()
[출처]
'PS > BOJ' 카테고리의 다른 글
백준 6918 옥상 정원 꾸미기 c++ (0) | 2022.01.13 |
---|---|
백준 1874 스택수열 c++ (0) | 2022.01.08 |
백준 2493 탑 c++ (0) | 2022.01.08 |
백준 5397 키로거 c++ (0) | 2022.01.04 |
백준 2003 수들의 합 2 (c++) (0) | 2022.01.04 |
댓글
이 글 공유하기
다른 글
-
백준 1874 스택수열 c++
백준 1874 스택수열 c++
2022.01.08 -
백준 2493 탑 c++
백준 2493 탑 c++
2022.01.08 -
백준 5397 키로거 c++
백준 5397 키로거 c++
2022.01.04 -
백준 2003 수들의 합 2 (c++)
백준 2003 수들의 합 2 (c++)
2022.01.04