2011年8月9日火曜日

TopCoder SRM213 Div2 250Pts

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

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計