今日の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 件のコメント:
コメントを投稿