https://www.acmicpc.net/problem/1541
import re
expression = re.sub(r'\d+',lambda x : str(int(x.group())),str(input())) # 0009 -> 9로 처리해서 받음
while re.findall(r'\d+[+-]',str(expression)) :
opr = re.findall(r'[+-]',expression)
if len(opr) > 1 and (opr[0] == '-') and (opr[1] == '+'): # 두번째 항 계산
expression = re.sub(r'\d+[+]\d+',lambda x: str(eval(x.group())),expression, count =1 )
else:# 첫번째 항 계산
expression = re.sub(r'[-]?\d+[+ -]\d+',lambda x: str(eval(x.group())),expression, count =1 )
print(expression)
계산 속도: 132ms
정규 표현식으로 코드를 잘 작성했으나, 위 해설보다 좀 더 영리한 방법이 있음
input_f = '+'+input()
# 00009 -> 9
while '+0' in input_f or '-0' in input_f:
input_f = input_f.replace("+0","+")
input_f = input_f.replace("-0","-")
# 30-45+72-60 => [30, 45+72, 60]
minus_split = input_f.split('-')
answer = eval(minus_split[0])
if len(minus_split) > 1:
for minus in minus_split[1:]:
answer -= eval(minus)
print(answer)
수식의 값을 최소로 만들기 위해서는 '-' 부호 뒷 수식을 먼저 계산해야 한다. 단, 뒷 수식이 '-'로 이루어진 경우는 순서가 상관이 없다.
예시) 30-45+72 => 30 - (45+72)
예시) 30-45-72+60 => 30 - (45 - (72+60)) => 30 - 45 - (72+60)
예시) 30-45-72-60 => 30 - (45 - (72 - (60))) => 30 - 45 - 72 - 60
'00009' -> '9' 로 변환하기 위해서 처음 인풋에 '+'를 붙여준다. '+0' -> '+' 로 변경