[programmers]式の最大化


問題のショートカット
+、-、*の演算子のみで構成される演算子式で、演算子の優先度を再定義することによって得られる最大値の問題.

操作input

    nums = expression.replace('-', '*')
    nums = nums.replace('+', '*')
    nums = nums.split('*')
    nums = list(map(int, nums))
    ex = [i for i in expression if i in '+*-']
numsはデジタル配列で、exは演算子の配列ですexpression = "100-200*300-500+20" が与えられた場合、numsは[002350500,20]であり、exは[-]、[*]、[-]、[+]である.

number関数number関数:単純計算関数

def number(a,b,ex):
    if ex=='*':
        return a*b
    if ex == '-':
        return a - b
    return a + b
a、b(数値)値と、演算子exを渡すだけで、計算された値が返されます.

compute関数:優先度eで計算された値を返します。

   def compute(e, ex):
    newnum = nums.copy()
    newex = ex.copy()
    
    for ex in e:
        j = 0
        while j < len(newex):
            if newex[j] == ex:
                del newex[j]
                newnum[j] = number(newnum[j], newnum[j+1], ex)
                del newnum[j+1]
            else:
                j+=1
    return newnum[0]
優先度eを使用して計算された値を返します.

最後の一撃

for e in list(permutations(['+','*','-'], 3)):
    answer = max(answer, abs(compute(e, ex)))
    
permutationsは、可能なすべての演算シンボルの優先順位を取得するためのシーケンスライブラリである.

Others

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)]
            print(temp)
            temp_list.append(f'({b.join(temp)})')
        answer.append(abs(eval(a.join(temp_list))))
    return max(answer)
優先順位のものを()にまとめて先に計算します

eval関数


string値をexpressionパラメータに入れると、そのまま実行され、出力されます.
eval('123 * 1')

f-string


python 3.6から提供されるstring format
かっこで直接書式設定できます
name = 'Gayoung'
print(f'Hi my name is {name}')
f接頭辞は直接使用可能