このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
あなたたちが知っているように、JOHNという名前ほどよいものはない。名前を比較するルールを定義しよう。アルファベットはAからZの順に1から26までの整数の重みがつけられている。名前の重みは名前全体の重みの総和である。2つの名前を比較するとき、重みが大きい方を良いものとする。もし重みが一致するのであれば、辞書で引いたときに先に来るものがよい。ただし、JOHNという名前はどんな名前よりもよいものとする。names[]という名前が入った文字列型配列が与えられたとき、その名前を良いものから悪いものになるように並べ替えたものを返すメソッドを作成せよ。
私の解答はこちら。
import java.util.Arrays;
import java.util.HashMap;
public class TheBestName {
public String[] sort(String[] names) {
sortByName[] data = new sortByName[names.length];
for( int i=0 ; i<names.length ; i++ ){
data[i] = new sortByName(names[i]);
}
Arrays.sort(data);
String[] ret= new String[names.length];
for( int i=0 ; i<ret.length ; i++ ){
ret[i] = data[i].name;
System.out.println(ret[i]);
}
return ret;
}
}
class sortByName implements Comparable<sortByName>{ // ソートのためのオブジェクト
String name;
int weight;
public sortByName(String name) { // 名前と名前の重みで初期化
int weight = 0;
for( int j=0 ; j<name.length() ; j++ ){
weight += name.charAt(j)-'A'+1;
}
this.weight = weight;
if( name.equals("JOHN") ) this.weight = Integer.MAX_VALUE;
this.name = name;
}
public int compareTo(sortByName o) { // 比較のルール
if( weight - o.weight != 0 ) return o.weight-weight;
return name.compareTo(o.name);
}
}得点は161.76/250、1回のsubmitでシステムテストクリア。SRM当日の正解率は約69%。weightを初期化する際に、+1を省略してはならないことに気付かずタイムロス。Aを0としてしまうと、AよりもAAが先に来る場合に、AAが先に来るようにできないので失敗してしまうというのが原因だった。
0 件のコメント:
コメントを投稿