🔗 전체 문제 : 수식 최대화
같은 연산자끼리는 앞에 있는 것의 우선순위가 더 높습니다.
- 숫자와 수식 분리하기
- 수식의 우선순위 정하기
- 우선순위에 따른 결과 계산하기
분할 정복 문제
😣 문제를 못풀었다! 다른 분들의 풀이를 보고 복습하기 😣
👀 풀이 1
# 파이썬
from itertools import permutations
import re
def solution(expression):
expressions = set(re.findall("\D", expression))
prior = permutations(expressions)
cand = []
for op_cand in prior:
temp = re.compile("(\D)").split('' + expression)
for exp in op_cand:
while exp in temp:
idx = temp.index(exp)
temp = temp[:idx-1] + [str(eval(''.join(temp[idx-1:idx+2])))] + temp[idx+2:]
cand.append(abs(int(temp[0])))
return max(cand)
👀 풀이 2
import re
from itertools import permutations
def solution(expression):
#1
op = [x for x in ['*','+','-'] if x in expression]
op = [list(y) for y in permutations(op)]
ex = re.split(r'(\D)',expression)
#2
a = []
for x in op:
_ex = ex[:]
for y in x:
while y in _ex:
tmp = _ex.index(y)
_ex[tmp-1] = str(eval(_ex[tmp-1]+_ex[tmp]+_ex[tmp+1]))
_ex = _ex[:tmp]+_ex[tmp+2:]
a.append(_ex[-1])
#3
return max(abs(int(x)) for x in a)
👀 풀이 3
from itertools import permutations
def calc(priority, n, expression):
if n == 2:
return str(eval(expression))
if priority[n] == '*':
res = eval('*'.join([calc(priority, n + 1, e) for e in expression.split('*')]))
if priority[n] == '+':
res = eval('+'.join([calc(priority, n + 1, e) for e in expression.split('+')]))
if priority[n] == '-':
res = eval('-'.join([calc(priority, n + 1, e) for e in expression.split('-')]))
return str(res)
def solution(expression):
answer = 0
priorities = (list(permutations(['*','-','+'], 3)))
for priority in priorities:
res = int(calc(priority, 0, expression))
answer = max(answer, abs(res))
return answer
👀 풀이 4
def solution(expression):
operations = [('+', '-', '*'),('+', '*', '-'),('-', '+', '*'),('-', '*', '+'),('*', '+', '-'),('*', '-', '+')]
answer = []
for op in operations:
a = op[0]
b = op[1]
temp_list = []
for e in expression.split(a):
temp = [f"({i})" for i in e.split(b)]
temp_list.append(f'({b.join(temp)})')
answer.append(abs(eval(a.join(temp_list))))
return max(answer)