今日のTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。
2列(first、secondと呼ぼう)のフォーク並びの列がある。これらの列をまとめるときに、男性は女性に先に行かせる。2列の先頭の二人の性別が同じであれば、firstの人が先に並ぶ。2列の男女の順序が文字列で与えられたときに、列をまとめた結果を返すメソッドを作成せよ。文字列のMは男性を、Wは女性を表している。また、列の先頭は文字列の先頭になる。
例えば、1番目の列に"MMWM"、2番目の列に"WMMM"が与えられると、結果は"WMMWMMMM"になる。
私の解答は以下の通り。求められた通りに書いたら愚直なコードになりました。
public class Chivalry {
public String getOrder(String first, String second) {
StringBuffer order = new StringBuffer();
int i=0,j=0;
while(true){
// i、jで2列を何番目までチェックしたかを管理している。
// 最初の2分岐は、どちらかの列の人をすべてまとめ終えた状態である
// 後半の4分岐は、2列の先頭の性別で2*2=4通りあるので単純な場合分けをしている
if( i == first.length() ){
order.append(second.substring(j));
break;
}else if( j == second.length() ){
order.append(first.substring(i) );
break;
}else if( first.charAt(i)=='M' && second.charAt(j)=='M' ){
order.append("M");
i++;
}else if( first.charAt(i)=='W' && second.charAt(j)=='W' ){
order.append("W");
i++;
}else if( first.charAt(i)=='W' && second.charAt(j)=='M' ){
order.append("W");
i++;
}else if( first.charAt(i)=='M' && second.charAt(j)=='W' ){
order.append("W");
j++;
}
}
return order.toString();
}
}得点は186.67、中央値は約183点。ちなみに、Chivalryというのは、騎士道精神という意味らしいです。

0 件のコメント:
コメントを投稿