2012年3月22日木曜日

TopCoder SRM346 Div2 250Pts

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

あなたは奇妙な鉱物の中にあるダイヤモンドを探すダイヤモンドハンターである。鉱物は"<"と">"という文字からなる文字列で、ダイヤモンドは"<>"という部分列である。ダイヤモンドを見つける度に、それを除いたものが残りの鉱物として扱われる。"><<><>>><"という文字列が与えられると、"><<>>><"となり、"><>><"になる。さらにもう一度取り除いて">><"となると、鉱物にダイヤモンドは無くなり、"<>"を取り除く操作は終了する。mineという"<"、">"からなる文字列が与えられたとき、その中に含まれるダイヤモンドの数を返せ。なお、どの順でダイヤモンドを取り除いたとしても、同じ結果になることに注意せよ。

私の解答はこちら。

public class DiamondHunt {

 public int countDiamonds(String mine) {
  StringBuffer sb = new StringBuffer();
  int nDiamonds = 0;
  while( true ){
   boolean diaRemain = false;
   int pos = -1;
   // ダイヤモンドの存在判定
   for( int i=0 ; i<mine.length()-1 ; i++ ){
    if( mine.charAt(i) == '<' && mine.charAt(i+1) == '>' ){
     nDiamonds++;
     pos = i;
     diaRemain = true;
     break;
    }
   }
   if( diaRemain == false ){
    break; // ダイヤモンドが存在しないならカウント終了
   }else{
    // 上で見つけた文字(pos、pos+1の位置にある"<>")を除く
    for( int i=0 ; i<mine.length() ; i++ ){
     if( i == pos || i == pos+1 ) continue;
     sb.append(mine.charAt(i));
    }
    mine = sb.toString();
    sb.delete(0, sb.length());
   }
  }
  return nDiamonds;
 }

}

得点は204.24/250、中央値は約214点。1回の提出でシステムテストクリア。ちょっと長めのコードですが、やろうとしていることは単純。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計