프로그래머스/lv.2

수식 최대화

bingual 2024. 3. 16. 19:32
반응형

 

https://school.programmers.co.kr/learn/courses/30/lessons/67257

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제풀이

 

  • 정수와 연산자를 각각 나누어 준다.
  • 최대 가능한 조합은 3! 이기 때문에 3개의 연산자로 이루어진 순열을 구해주며 정수 배열은 연산자 배열에 비해 크기가 1이 크다. 따라서 (좌측 피연산자 연산자 우측 피연산자)에 대한 계산이 가능하다. 연산자를 만났을 때 연산자를 기준으로 피연산자에 대해 계산을 해준다. 계산에 사용된 좌측 피연산자는 계산 값으로 갱신하고 계산에 사용된 우측 피연산자와 연산자는 제거해 준다. 
  • 해당 과정이 끝나면 정수 배열은 계산된 하나의 정수만 남기 때문에 그중 최대 값을 경신해 준 것이 답이 된다.
from itertools import permutations
import re


def solution(expression):
    answer = 0
    numbers = list(map(int, re.split("[*+-]", expression)))
    operators = re.findall("[*+-]", expression)

    for operator_order in permutations(["*", "+", "-"]):
        temp_numbers = numbers[:]
        temp_operators = operators[:]

        for op in operator_order:
            i = 0
            while i < len(temp_operators):
                if temp_operators[i] == op:
                    if op == "+":
                        temp_numbers[i] += temp_numbers[i + 1]
                    elif op == "-":
                        temp_numbers[i] -= temp_numbers[i + 1]
                    elif op == "*":
                        temp_numbers[i] *= temp_numbers[i + 1]

                    del temp_numbers[i + 1]
                    del temp_operators[i]
                else:
                    i += 1

        answer = max(answer, abs(temp_numbers[0]))
    return answer