2012年3月26日月曜日

TopCoder SRM351 Div2 250Pts

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

あなたは自分の部屋のドアに番号をつけようとしている。家の近くの店からは、プラスチックでできた素敵な数字のセットが提案された。セットはきっちり10個の桁を含んでいる。10個の各桁は0~9の整数である。roomNumberという部屋番号が与えられたとき、必要となる数字のセットの数を返せ。なお、6は9としても使える(その逆も然りである)。

例えば6699であれば2となり、1234567890であれば1、112345は2という結果が返されることになる。

私の解答はこちら。

public class RoomNumber {

 public int numberOfSets(int roomNumber) {
  int[] n = new int[10];
  while( roomNumber > 0 ){
   int mod = roomNumber % 10;
   n[mod]++; // 数字の出現回数をカウント
   roomNumber /= 10;
  }
  int n69 = 0; // 6と9が登場した回数
  int max = 0;
  for( int i=0 ; i<n.length ; i++ ){
   if( i!=6 && i!=9 ){ // 6と9以外で必要なセット数の最大値を計算
    max = Math.max(max, n[i]);
   }else{ // 6と9だけは登場回数をカウント
    n69 += n[i];
   }
  }
  n69 = n69%2 == 0 ? n69/2 : n69/2+1; // 6と9で必要になるセット数を計算
  max = Math.max(max, n69);
  return max;
 }

}

得点は219.52/250。1回の提出でシステムテストクリア。6と9の数だけはroomNumberに6と9が出現した回数の合計で考えなければならない。解答の作成よりも、問題文の読解に手間取った感がありました。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計