プログラマ[Kakao]の式を最大化する(Java)


リンク


質問リンク

問題の説明


ITベンチャーを運営するライアンは、毎年社内のハッカー大会を開き、勝者にボーナスを支給している.
今大会は、これまでの大会とは異なる方式で優勝者の賞金を決める.
「ハッカートン」大会に参加するすべての参加者に対して、1つの数値と3つの演算子(+,-,)を渡すだけで演算子式が得られます.参加者のタスクは、伝達された式に含まれる演算子の優先度を自由に再定義できるように、最大の数値をコミットすることです.
ただし、演算子の優先度を再定義する場合は、同じ優先度の演算子は使用できません.つまり、+>->または->+などの演算子優先度を定義できますが、2つ以上の演算子が同じ優先度を持つように、+、>-または*>+、-)などの演算子優先度を定義することはできません.式に2つの演算子が含まれている場合、定義できる演算子の優先度は2になります!=2つの演算子、3つの演算子の場合は3!=6種類の組み合わせがあります.
計算結果が負数の場合は、その数値の節値に変換してコミットし、コミットされた数値の最大の参加者を優勝者として選択し、優勝者がコミットした数値を優勝者ボーナスとして選択します.
たとえば、参加者の4人が次の式を受け取ったとします.
"100-200*300-500+20"
通常、加算および減算は、数学および計算で約束された演算子の優先度に基づいて等しく、加算および減算の優先度が高く、それぞれ>+および-と定義されます.
競争ルールに従って、+>->または->>+などの演算子の優先度を定義できますが、演算子の優先度を定義することはできません.2つ以上の演算子(+、>-または>+、-)が同じ優先度になります.
式には3つの演算子があるので、可能な演算子の優先度は3!=+>->を使用して6つの演算子を優先順位付けすると、結リンゴの値は22000ウォンになります.
逆に、*>+>-を使用して演算子を優先順位付けすると、式の結リンゴ値は-60420になりますが、ルールによっては優勝時のボーナスは60420ウォンで絶対値になります.
参加者に所定の演算式を持つ文字列式をパラメータとして与える場合は、solution関数を完了して、優勝時に得られる最大ボーナス金額を返します.

[制限]

  • 式は、3または100より長い文字列です.
  • 式は、スペース、カッコを使用せずに、数値と3つの演算子(+、-、*)のみを使用する演算式です.入力として無効な式は指定されません.
  • (「402+-561*」)は、正しい中位数ではないため、無効な式を提供しません.
  • 式の被演算子(オペランド)は999以下である.
  • (すなわち、「100-2455*458+12」)は、999より大きい被演算子を含む式を入力として提供しない.
  • "-56+100"のように、入力された式も演算子によって負数ではありません.
  • 式には、少なくとも1つの演算子が含まれます.
  • 演算子の優先度をどのように適用しても、式の中間計算値と最終結アップル値は263-1を下回るように入力されます.
  • たとえば、
  • では、前の演算子の優先度が高くなります.
  • I/O例



    I/O例説明(写真の置き換え)



    に答える

  • まず数字と演算子を分けて、それぞれリスト(list,c list)
  • に置く
  • 演算子の優先順位を並べ替えます.(もちろん、ハードコーディングの方法は6種類のみ)
  • が復帰する脱出条件を満たすと、コールが行われる.
  • 計算機は、より優先度の高い演算に遭遇すると、そのインデックスとインデックス+1が対応する演算を実行します.
  • プロセスは、Listのremoveを利用する.
  • この问题は最初方向を间违えて本当に大変でした.

    以前の解釈

  • 最初は、数値と演算子をあらかじめ分離せず、文字列パケットのみで解決!ハハハ
  • 演算子の優先度は、
  • で再帰的に決定される.
  • 計算機では、最も優先度の高い演算子に遭遇した場合、対応する演算はサブストリング&parseLongを使用して実行されます.
  • しかし、この答えには最大の問題がある.
    演算中に負数が発生した場合、負数の前の-を演算子として認識します.
    ここで殴られた...

    再び戻ってくる。


    どうせこうやって解決したんだ!
    ああ、そしてリストをパラメータとして送信すると、アドレス値がそのまま移動します…
    だから後でリストをメディアとして送るときはクローンして送りましょう!

    コード#コード#

    import java.util.*;
    class Solution {
        static char[] top = {'-', '*', '+'};
        long answer;
        public void swap(int a, int b){
            char k = top[a];
            top[a] = top[b];
            top[b] = k;
        }
        public long Calculate(ArrayList<Long> list, ArrayList<Character> c_list) {
            for(int i = 0; i < 3; i++) {
                for(int j = 0; j < c_list.size(); j++) {
                    if(c_list.get(j) == top[i]) {
                        switch(top[i]) {
                            case '-':
                                list.add(j, list.remove(j) - list.remove(j));
                                break;
                            case '*':
                                list.add(j, list.remove(j) * list.remove(j));
                                break;
                            case '+':
                                list.add(j, list.remove(j) + list.remove(j));
                                break;
                        }
                        c_list.remove(j--);
                    }       
                }
            }
            return Math.abs(list.get(0));
        }
        public void perm(ArrayList<Long> list, ArrayList<Character> c_list, int depth) {
            if(depth == 3) {
                long temp = Calculate((ArrayList<Long>)list.clone(), (ArrayList<Character>)c_list.clone());
                if(temp > answer)
                    answer = temp;
                return ;
            }
            for(int i = depth; i < 3; i++){
                swap(i, depth);
                perm(list,c_list,depth + 1);
                swap(i, depth);
            }
        }
        public long solution(String expression) {
            ArrayList<Long> list = new ArrayList();
            ArrayList<Character> c_list = new ArrayList();
            int i;
            String num = "";
            for(i = 0; i < expression.length(); i++) {
                if(expression.charAt(i) >= '0' && expression.charAt(i) <= '9')
                {
                    num += expression.charAt(i);
                }
                else
                {
                    list.add(Long.parseLong(num));
                    num = "";
                    c_list.add(expression.charAt(i));
                }
            }
            list.add(Long.parseLong(num));
            perm(list, c_list,0);
            return answer;
        }
    }