반응형
https://www.acmicpc.net/problem/19591
자료구조를 이용한 깡 구현 문제이다. 구현문제아니랄까 한글자 오타난 걸 디버깅하느라 애를 먹었다. (무수한 assert 문 제출 시도..)
맨 앞의 연산자 / 맨 뒤의 연산자 둘중 하나를 골라서 스택처럼 처리해야하므로 덱을 이용했다.
파이썬으로 풀 때 음수 나눗셈에 주의하고, 음수 하나만 입력으로 들어오는 코너케이스를 주의하면 어렵지 않게 풀 수 있다.
from collections import deque
def calc(n1, op, n2):
if op == '+':
return n1 + n2
elif op == '*':
return n1 * n2
elif op == '-':
return n1 - n2
else:
if n1*n2 < 0 and n1%n2 != 0:
return (n1 // n2) + 1
return n1 // n2
s = input()
exp = deque()
num = None
neg = False
for c in s:
if c.isdigit():
if num == None:
num = 0
num *= 10
num += int(c)
else:
if num == None:
neg = True
else:
if neg:
exp.append(-num)
neg = False
else:
exp.append(num)
exp.append(c)
num = None
if neg:
exp.append(-num)
neg = False
else:
exp.append(num)
while len(exp) > 1:
result = 'front'
op1 = exp[1]
op2 = exp[-2]
if op1 in ('+', '-') and op2 in ('*', '/'):
result = 'back'
elif op1 in ('*', '/') and op2 in ('+', '-'):
result = 'front'
else: # 연산자 우선순위가 같은 경우
calc1 = calc(exp[0], exp[1], exp[2])
calc2 = calc(exp[-3], exp[-2], exp[-1])
if calc1 > calc2:
result = 'front'
elif calc1 < calc2:
result = 'back'
else: # 연산자의 계산 값이 같은 경우
result = 'front'
if result == 'front':
calc_result = calc(exp[0], exp[1], exp[2])
for _ in range(3):
exp.popleft()
exp.appendleft(calc_result)
else:
calc_result = calc(exp[-3], exp[-2], exp[-1])
for _ in range(3):
exp.pop()
exp.append(calc_result)
print(exp[0])
반응형
'알고리즘 (PS) > BOJ' 카테고리의 다른 글
[백준] 2098 - 외판원 순회 (G1) (0) | 2022.08.21 |
---|---|
[백준] 12850 - 본대 산책 2 (G1) (2) | 2022.05.14 |
[백준] 16566 - 카드 게임 (P5) (2) | 2022.03.14 |
[백준] 14244- 트리 만들기 (S4) (0) | 2022.02.14 |
[백준] 9527 - 1의 개수 세기(Counting ones) (G2) (0) | 2022.02.13 |