プログラマ[Kakao]の式を最大化する(Java)
20211 ワード
リンク
質問リンク
問題の説明
ITベンチャーを運営するライアンは、毎年社内のハッカー大会を開き、勝者にボーナスを支給している.
今大会は、これまでの大会とは異なる方式で優勝者の賞金を決める.
「ハッカートン」大会に参加するすべての参加者に対して、1つの数値と3つの演算子(+,-,)を渡すだけで演算子式が得られます.参加者のタスクは、伝達された式に含まれる演算子の優先度を自由に再定義できるように、最大の数値をコミットすることです.
ただし、演算子の優先度を再定義する場合は、同じ優先度の演算子は使用できません.つまり、+>->または->+などの演算子優先度を定義できますが、2つ以上の演算子が同じ優先度を持つように、+、>-または*>+、-)などの演算子優先度を定義することはできません.式に2つの演算子が含まれている場合、定義できる演算子の優先度は2になります!=2つの演算子、3つの演算子の場合は3!=6種類の組み合わせがあります.
計算結果が負数の場合は、その数値の節値に変換してコミットし、コミットされた数値の最大の参加者を優勝者として選択し、優勝者がコミットした数値を優勝者ボーナスとして選択します.
たとえば、参加者の4人が次の式を受け取ったとします.
"100-200*300-500+20"
通常、加算および減算は、数学および計算で約束された演算子の優先度に基づいて等しく、加算および減算の優先度が高く、それぞれ>+および-と定義されます.
競争ルールに従って、+>->または->>+などの演算子の優先度を定義できますが、演算子の優先度を定義することはできません.2つ以上の演算子(+、>-または>+、-)が同じ優先度になります.
式には3つの演算子があるので、可能な演算子の優先度は3!=+>->を使用して6つの演算子を優先順位付けすると、結リンゴの値は22000ウォンになります.
逆に、*>+>-を使用して演算子を優先順位付けすると、式の結リンゴ値は-60420になりますが、ルールによっては優勝時のボーナスは60420ウォンで絶対値になります.
参加者に所定の演算式を持つ文字列式をパラメータとして与える場合は、solution関数を完了して、優勝時に得られる最大ボーナス金額を返します.
[制限]
I/O例
I/O例説明(写真の置き換え)
に答える
以前の解釈
演算中に負数が発生した場合、負数の前の-を演算子として認識します.
ここで殴られた...
再び戻ってくる。
どうせこうやって解決したんだ!
ああ、そしてリストをパラメータとして送信すると、アドレス値がそのまま移動します…
だから後でリストをメディアとして送るときはクローンして送りましょう!
コード#コード# 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;
}
}
Reference
この問題について(プログラマ[Kakao]の式を最大化する(Java)), 我々は、より多くの情報をここで見つけました
https://velog.io/@qodlstjd12/프로그래머스-Kakao-수식최대화-Java
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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;
}
}
Reference
この問題について(プログラマ[Kakao]の式を最大化する(Java)), 我々は、より多くの情報をここで見つけました https://velog.io/@qodlstjd12/프로그래머스-Kakao-수식최대화-Javaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol