2011年6月16日木曜日

TopCoder SRM187 Div2 300Pts

今日も英語の速読とJavaのトレーニング。問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。

問題をおおまかに訳す。オフィスに来る人は効率を上げたいので、できるだけオフィスに近い位置から駐車場に止めようとする。駐車位置に応じてオフィスに近いところから1,2,...とラベルがついている。今、eventsで"人名 出入"という文字列型の配列が入力されたときに、最大で何人が駐車していたか返すメソッドを作成せよ。ただし、初期状態では、駐車場に車は無いものとする。また、ある人が出発の前には必ず事前に駐車場に止める操作が含まれているものとする。 例えば、{"A arrives","B arrives","B departs"}という配列が入力された場合は、AとBが駐車した状態がもっとも駐車場が埋まった状態なので、2という値が返される。

私の解答は以下の通り。問題文中の駐車位置に応じて番号を振るということの意味があまり感じられないですね。

public class OfficeParking {
 public int spacesUsed(String[] events) {
  int maxUsed = 0;
  int currentUsed = 0;
  for( int i=0 ; i<events.length ; i++){
   String tmp[] = events[i].split(" ");
   if( tmp[1].equals("arrives")==true ){
    currentUsed++;
   }else{
    currentUsed--;
   }
   if( maxUsed < currentUsed ){
    maxUsed++;
   }
  }
  return maxUsed;
 }
}

得点は292.32/300と、最高点に近い出来。正解までたどり着いた人は約80%。Javaで文字列を分割する際にはsplitメソッドを用いることを学んだ。また、他の解答から、maxUsed = Math.max(maxUsed,curerntUsed)という更新の方法で書くと、行数が少なくなって見通しが良くなるということに気付いた。スピードも大事だが、可読性も考慮しなければ。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計