[프로그래머스] 수식 최대화
문제
해커톤 대회에 참가하는 모든 참가자들에게는 숫자들과 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
Author And Source
이 문제에 관하여([프로그래머스] 수식 최대화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@haman/프로그래머스-수식-최대화저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)