문제

[프로그래머스] 수식 최대화 (LV. 2)

요약

  • 연산식이 주어진다.
  • +, *, - 의 연산자의 계산순서를 임의로 정하여, 연산식의 계산 결과 최댓값을 반환하라.

분류

  • 완전 탐색
  • 순열
  • 정규표현식

풀이

1. 완전 탐색, 순열

  1. 정규 표현식을 이용해, 연산자를 순서에 맞게 뽑아낸다. 정규 표현식을 이용해 연산자와 숫자를 split 하고 리스트로 뽑아낸다.
  2. 뽑아낸 연산자들의 모든 경우의 수를 만든다.
  3. 계산할 땐, 3개의 요소(숫자, 연산자, 숫자) 를 이용해 계산하고, 앞의 두 요소를 지운 후, 마지막 요소를 연산 결과로 업데이트한다. (숫자, 연산자, 숫자 => 계산결과)
  4. 최종 계산 결과의 절댓값을 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)