[프로그래머스] 수식 최대화

문제

해커톤 대회에 참가하는 모든 참가자들에게는 숫자들과 3가지의 연산문자(+,-,*)만으로 이루어진 연산수식이 전달되며, 수식에 포함된 연산자의 우선순위를 자유롭게 재정의하여 만들 수 있는 가장 큰 숫자를 제출하는 것입니다.
단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다.
만약 계산된 결과가 음수라면 해당 숫자의 절대값으로 변환하여 제출하며 제출한 숫자가 가장 큰 참가자를 우승자로 선정하며, 우승자가 제출한 숫자를 우승상금으로 지급합니다.

제한사항

  • expression은 길이가 3 이상 100 이하인 문자열입니다.
  • expression은 공백문자, 괄호문자 없이 오로지 숫자와 3가지의 연산자(+,-,*)만으로 이루어진 올바른 중위표기법(연산의 두 대상 사이에 연산기호를 사용하는 방식)으로 표현된 연산식입니다. 잘못된 연산식은 입력으로 주어지지 않습니다.
    • 즉, '402+-561*'처럼 잘못된 수식은 올바른 중위표기법이 아니므로 주어지지 않습니다.
  • expression의 피연산자(operand)는 0이상 999 이하의 숫자입니다.
    • 즉, '100-2145*458+12'처럼 999를 초과하는 피연산자가 포함된 수식은 입력으로 주어지지 않습니다.
    • '-56+100'처럼 피연산자가 음수인 수식도 입력으로 주어지지 않습니다.
  • expression은 적어도 1개 이상의 연산자를 포함하고 있습니다.
  • 연산자 우선순위를 어떻게 적용하더라도, expression의 중간 계산값과 최종 결과값은 절대값이 2^63-1 이하가 되도록 입력이 주어집니다.
  • 같은 연산자끼리는 앞에 있는 것의 우선순위가 더 높습니다.

코드

from itertools import permutations
from copy import deepcopy

def solution(expression):
    answer = 0
    number, operand = [], []
    i = 0
    for index, ex in enumerate(expression):
        if ('0'<=ex<='9') == False :
            operand.append(ex)
            number.append(int(expression[i:index]))
            i = index+1
    number.append(int(expression[i:]))
    
    for per in list(permutations(['+','-','*'],3)):
        tn, to = deepcopy(number), deepcopy(operand)
        for op in per:
            i = 0
            while True:
                if i == len(to): break
                if to[i] == op:
                    tn[i] = cal(op,tn[i],tn[i+1])
                    tn.pop(i+1)
                    to.pop(i)
                else:
                    i += 1
        answer = max(answer, abs(tn[0]))
    return answer

def cal(op, a, b):
    if op == '+': return a+b
    elif op == '-': return a-b
    else: return a*b

좋은 웹페이지 즐겨찾기