2011年12月27日火曜日

TopCoder SRM294 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について、おおまかに説明する。

あなたは正当な提案と思われることをしてきた立派な男性に偶然にも出会った。スリーカードモンテをしようというのである。男性はまず、テーブルにカードをジョーカー、エース、ジョーカーの順にテーブルに並べる。あなたがちょっとだけお金をかけた後に、男性は2枚のカードの位置を交換する操作を始める。交換が終わったら、あなたはどこにエースがあるかを推測する。カードの位置交換はswapsという文字列で与えられる。文字の中身はL、R、E、Fの4文字からなる。swaps[0]が最初の男性のカードの位置交換を表す。4文字の意味はそれぞれ次の通りである。

  • L:左と真ん中のカードを交換
  • R:右と真ん中のカードを交換
  • E:左と右のカードを交換
  • F:だましの交換(実際にはカードは入れ替わらない)

全ての交換が終わった後に、エースの位置を返すメソッドを作成せよ。メソッドの返り値は、エースが左にあるなら"L"、右にあるなら"R"、真ん中にあれば"M"を返すようにせよ。

私の解答はこちら。

public class ThreeCardMonte {

 public String position(String swaps) {
  String[] cPos = {"J", "A", "J"}; // Jがジョーカー、Aがエースを表す
  // 前半のfor文でスワップが終わる。後半のfor文で返す文字を探索する。
  for( int i=0 ; i&;t;swaps.length() ; i++ ){
   char c = swaps.charAt(i);
   if( c == 'L'){ // 各文字ごとの処理、Fの処理は不要
    String tmp = cPos[0];
    cPos[0] = cPos[1];
    cPos[1] = tmp;
   }else if( c == 'R' ){
    String tmp = cPos[1];
    cPos[1] = cPos[2];
    cPos[2] = tmp;
   }else if( c == 'E' ){
    String tmp = cPos[2];
    cPos[2] = cPos[0];
    cPos[0] = tmp;
   }
  }
  String[] ret = {"L", "M", "R"}; // どこにAがあるかを示す文字
  for( int i=0 ; i<cPos.length ; i++ ){
   if( cPos[i].equals("A") ) return ret[i];
  }
  return null; // C言語と違って必ず返す値があるように見せかけないといけない。
 }
}

得点は226.69/250、中央値は約217点。スワップはメソッド化してもよかったかもしれません。作成するとするのであれば、交換する位置2つ(整数値)とcPosを引数に取るようなメソッドになるでしょうか。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計