2011年4月29日金曜日

TopCoder SRM178 Div2 250pts

本日の問題はこちら(要TopCoder登録 & 問題文は英語)。

問題のおおまかな訳は以下の通り。

四則演算ができる計算機クラスSimpleCalculatorを考える。入力の形式は文字列で入力され、<数値> <op> <数値>という形式をしている。<数値>は1以上10000以下の数である。<op>は+、-、*、/のどれかである。このとき、演算結果を返すSimpleCalculatorのメソッドcalculateを作成せよ。結果は0以下になることも当然ありうる。

例えば、"200/4"という文字列が入ってきたら答えは50である。

私が書いたコードはこちら。

public class SimpleCalculator {
 public int calculate(String input) {
  int[] num = new int[2];
  String[] snum = new String[2];
  String sop="";
  String[] ops = new String[]{"+","-","*","/"};
  int op=0;
  for( int i=0 ; i<ops.length ; i++){ // 数値と数値の間にある記号を判定
   if( input.indexOf(ops[i]) >=0 ){
    op = i;
    sop = ops[i];
    break;
   }
  }
  if( sop.equals("*") ){ // 記号がメタ文字であった場合の対処
   sop = "\\*";
  }else if( sop.equals("+") ){
   sop = "\\+";
  }
  snum = input.split(sop);
  for( int i=0 ; i<2 ; i++){
   num[i] = Integer.parseInt(snum[i]);
  }
  switch(op){ // 文字の種類に応じて処理を決める
   case 0:
    return num[0]+num[1];
   case 1:
    return num[0]-num[1];
   case 2:
    return num[0]*num[1];
   case 3:
    return num[0]/num[1];
   default:
    break;
  }
  return 0;
 }
}

得点は158.30/250(System Test Passed)。点数も低いし、汚いコードになってしまった。

最初に躓いたのが正規表現で、+や*がメタ文字ではなく、文字列としての+や*にしてならないといけないということに気付かなかった。+と*だけエスケープシーケンスを付けるという汚い書き方で対処。次に汚いコードと感じられる点は変数opで、これをint型でなく、せめてchar型にしておけば、後半のswitch文に意味のある変数として渡せるということである。0,1,2,3という処理はあまりきれいじゃないな。

新しく学んだこととしては、Integer.parseInt("00001")=1になってくれるということである。自動的に先頭の0は削除してくれるようだ。今回のコードはもう少し学べばもっとうまくかけそうだ。

0 件のコメント:

コメントを投稿

フォロワー

ページビューの合計