[アルゴリズム]Programmers式の最大化


解けると喜んでアップロードするので、コードが不潔で、最適化されていないことに注意.
[Programmers]式最大化リンク
質問する
問題が長すぎる.簡単に言えば、式には文字列が与えられ、ここで演算子(-,*,+)の可能なすべての優先度を計算する場合、式の答えは最大値です.ただし、結果値は絶対値で計算されます.その他の条件は質問を参照してください
どうやって解いたの?
最近ずっと探索しているせいか、見ていると完全に探索しているような気がします.文字列が受信された場合、演算子のみを選択し、置換でシーケンスを生成し、そのシーケンスの順序に従って優先度を配置し、すべての計算でアクセスするべきだと思います.優先順位はスタック計算機に似ていると思います.
どこをうろうろしてたっけ?

  • まず最も意味のない部分で、何の考えもない入力値式の中で、1つ1つのスペースで考えて、よく考えてみると、数字は必ずしも1つの位置ではありませんて、ほほほ、私は自分が本当に愚かだと思います.時間的に展開されるので、空の文字列を追加するときに演算子に遭遇したときにスタックにプッシュし、出力値がおかしい.もちろん、演算子に遭遇しない最後の値はスタックにプッシュされていない!!!だから正規表現が思い出せないので、「+」を「+」に、「-」を「-」に、スペースを両側に、split(「」)を配列に加えて、一つ一つ持ってきます.😢. 他の友達が解いたのを見てよく使ったようです...私もデータを勉強しているうちにしっかり書こうと思っています.

  • しかもスタック計算機を久しぶりにやったのでちょっと混同私より優先度の高い人がスタックにいると計算して入る方法ですでもこれは出力値を見て解決します
  • Code
    from itertools import permutations
    
    max_val = float("-inf")
    
    def operation(op,num1,num2) :
        if op == "+" :
            return num1+num2
        elif op == "-" :
            return num1-num2
        elif op == "*" :
            return num1*num2
        
        
    def cal(op,expression) :
        global max_val
        
        expression = expression.replace("+"," + ").replace("-"," - ").replace("*"," * ").split(" ")
        #이 부분을 정규표현식을 써서 더 잘 처리할 수 있을 것 같다.
           
        val = 0
      
        op_index = [0+i for i in range(len(op))]
        op_index = sorted(op_index, reverse=True)    
        op_compare = dict(zip(op,op_index))
        #급해가지고 이렇게 썼었는데 더 잘 쓰는 법이 있지 않을까
        
        stack_op = []
        stack_num = []
        
        
        for s in expression :
            if s in op :
                if not stack_op :
                    stack_op.append(s)
                else :
                    stack_op_top = stack_op[-1]
                    if op_compare[s] > op_compare[stack_op_top] :
                        stack_op.append(s)
                    else :
                        while stack_op and op_compare[s] <= op_compare[stack_op[-1]]  :
                            stack_op_top = stack_op.pop()
                            num1 = stack_num.pop()
                            num2 = stack_num.pop()
                            result = operation(stack_op_top,num2,num1)
                            stack_num.append(result) 
                        stack_op.append(s) 
            else :
                stack_num.append(int(s))
        
         
        #남은 부분 처리
        while stack_op :
            top = stack_op.pop()
            num1 = stack_num.pop()
            num2 = stack_num.pop()
            result = operation(top,num2,num1)
            stack_num.append(result)
        
            
        m = stack_num[0]
        max_val = max(abs(m),max_val)
                
    def solution(expression):
        answer = 0
        
        operation = []
        
        for c in expression :
            if c == "+" or c == "-" or c == "*" :
                if c not in operation :
                    operation.append(c)
        
        operation_subset = list(permutations(operation))
        
        for op in operation_subset :
            cal(op,expression)
        
        answer = max_val
        
        return answer
    
    常にコードアップロードを最適化しないので進歩しません再放送しますが面倒なのでヒントは修正しません...今整理してから載せなければなりません.🤔