このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について、おおまかに説明する。
グループに分けられた長方形のリストを持っている。グループのインデックスはグループ内のすべての長方形の面積の総和である。もっとも大きいインデックスになるグループを求めようとしている。rectangles[]という文字列型の配列が与えられる。各要素は1つの長方形を表しており、そのフォーマットは"G L W"で表される。Gは長方形が属するグループ、Lは長方形の高さ、Wは長方形の幅を表している。作成するメソッドが返す文字列のフォーマットは"G I"である。Gは最大のインデックスになるグループの名前、Iはそのグループのインデックスである(先頭に0はつかない)。もし最大のインデックスになるものが複数あった場合、アルファベット順で一番最初に来るものを返すようにせよ。グループを表す文字は正規表現で言うところの[A-Z]である。
私の解答はこちら。
import java.util.Set;
import java.util.TreeMap;
public class RectangleGroups {
public String maximalIndexed(String[] rectangles) {
String[] work;
// キー値をアルファベット順にしておくためにTreeMapを利用する。
TreeMap<String, Integer> tm = new TreeMap<String, Integer>();
for( int i=0 ; i<rectangles.length ; i++ ){
work = rectangles[i].split(" ");
// 面積sは必ず利用するので先に計算しておく。
int s = Integer.parseInt(work[1])*Integer.parseInt(work[2]);
if( tm.containsKey(work[0]) == false ){
tm.put(work[0], s);
}else{
Integer v = (Integer)tm.get(work[0]);
tm.remove(work[0]);// 本当はリムーブは不要で
tm.put(work[0], v+s); // これで上書きすればよい。
}
}
Set<String> it = tm.keySet();
String[] keys = (String[]) it.toArray(new String[0]);
int max = 0;
String ret = "";
// 先頭から順にみて、面積最大を更新するグループを求める
// ここでTreeMapを利用したことが活きる
for( int i=0 ; i<keys.length; i++ ){
if( tm.get(keys[i]) > max ){
max = tm.get(keys[i]);
ret = keys[i] + " " + max;
}
}
return ret;
}
}得点は90.0/300、中央値は約239点。敗因はSetを配列に変換する方法(toArrayメソッドでnew String[0]を引数に取ること)を知らなかったことです。何日か前に同じようなパターンでtoArrayメソッドにはまっていたのを解消したついでに解きました。
0 件のコメント:
コメントを投稿