문제
요약
- 연산식이 주어진다.
- +, *, - 의 연산자의 계산순서를 임의로 정하여, 연산식의 계산 결과 최댓값을 반환하라.
분류
- 완전 탐색
- 순열
- 정규표현식
풀이
1. 완전 탐색, 순열
- 정규 표현식을 이용해, 연산자를 순서에 맞게 뽑아낸다. 정규 표현식을 이용해 연산자와 숫자를 split 하고 리스트로 뽑아낸다.
- 뽑아낸 연산자들의 모든 경우의 수를 만든다.
- 계산할 땐, 3개의 요소(숫자, 연산자, 숫자) 를 이용해 계산하고, 앞의 두 요소를 지운 후, 마지막 요소를 연산 결과로 업데이트한다. (숫자, 연산자, 숫자 => 계산결과)
- 최종 계산 결과의 절댓값을 max 연산을 이용해 갱신한다.
import re
from itertools import permutations as per
def cal(operator, a, b):
if operator == '*': return a * b
elif operator == '-': return a - b
elif operator == '+': return a + b
def solution(expression):
operator = re.findall('\D', expression)
arr = re.findall('\d+|\D', expression)
pers = list(per(set(operator), len(set(operator))))
answer = 0
for p in pers:
temp = arr.copy()
for cur_op in p:
for val in arr:
if val == cur_op:
idx = temp.index(val)
temp[idx + 1] = cal(val, int(temp[idx - 1]), int(temp[idx + 1]))
del temp[idx]
del temp[idx - 1]
answer = max(answer, abs(*temp))
return answer
2. (참고) eval() 을 이용한 풀이
- 프로그래머스 좋아요가 가장 많았던 풀이이다.
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)