このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。
女の子が好きな男の子の一人とデートしたいと思っているが、誰を選んでいいか分かっていない。幸いにして、女の子はLove Calculatorという、二人が愛し合っている確率を計算できるものを持っている。Love Calculatorは二人の名前を受け取り、以下のアルゴリズムに沿って、愛し合っている確率を計算する。
- Lは二人の名前に登場する'L'の出現回数
- Oは二人の名前に登場する'O'の出現回数
- Vは二人の名前に登場する'V'の出現回数
- Eは二人の名前に登場する'E'の出現回数
私の解答はこちら。
public class LoveCalculator { public String findBoy(String girl, String[] boys) { long maxprob = -1; int[] freq_girl = new int[4]; // LOVEという文字の出現回数を記録 String bestBoy = ""; for( int i=0 ; i<girl.length() ; i++ ){ if( girl.charAt(i) == 'L' ) freq_girl[0]++; if( girl.charAt(i) == 'O' ) freq_girl[1]++; if( girl.charAt(i) == 'V' ) freq_girl[2]++; if( girl.charAt(i) == 'E' ) freq_girl[3]++; } for( int i=0 ; i<boys.length ; i++ ){ int[] freq_boy = new int[4]; for( int j=0 ; j<[i].length() ; j++){ if( boys[i].charAt(j) == 'L' ) freq_boy[0]++; if( boys[i].charAt(j) == 'O' ) freq_boy[1]++; if( boys[i].charAt(j) == 'V' ) freq_boy[2]++; if( boys[i].charAt(j) == 'E' ) freq_boy[3]++; } int[] fr = new int[freq_girl.length]; for( int j=0 ; j<.length ; j++ ){ fr[j] = freq_girl[j] + freq_boy[j]; } long prob = ((fr[0]+fr[1])*(fr[0]+fr[2])*(fr[0]+fr[3])* (fr[1]+fr[2])*(fr[1]+fr[3])*(fr[2]+fr[3]))%100; if( prob > maxprob ){ bestBoy = boys[i]; maxprob = prob; }else if( prob == maxprob ){ if( bestBoy.compareTo(boys[i]) > 0 ){ bestBoy = boys[i]; } } } return bestBoy; } }
点数は183点台でした。配列よりもハッシュの方が綺麗に書けるんでしょうかね。probを計算するときは、6つの値を順に掛ける度に100で割っておけばオーバーフローを気にしなくてもよさそうです。すべて掛け算すると、最大で40^6まで値を取り得るので、上の実装では念のためlongにしています。
0 件のコメント:
コメントを投稿