2012年6月14日木曜日

TopCoder SRM397 Div2 250Pts

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

あなたは敵の暗号を解読しなければならない秘密の任務を負った。既に敵が以下の方法によってメッセージを暗号化しているということをつかんでいる。

  • 各文字は'a'から'z'の間の値だけからなり、アルファベットには01~26までの二桁の数字が割り当てられている。メッセージは文字を割り当てられた数字で単に置き換えただけのものである。
  • 例えば、tが20、eが05、sが19という数字を割り当てられていたとすれば、"test"という文字列は"20051920"と暗号化される。

codeという数字を文字に対応させたものが与えられる。codeの先頭の文字は01、2番目の文字は02などのように数字が割り当てられている。また、messageという暗号化後あるいは暗号化前の文字列が与えられる。暗号化前であれば暗号化したメッセージを、暗号化後の文字列が与えられているなら暗号化前の元のメッセージを返すようなメソッドを作成せよ。

私の解答はこちら。

public class BreakingTheCode {

 public String decodingEncoding(String code, String message) {
  StringBuilder sb = new StringBuilder();
  // 先頭の文字を見て処理のパターンを変えている
  if( message.charAt(0) >= '0' && message.charAt(0) <= '9'){ 
   for( int i=0 ; i<message.length()/2 ; i++ ){
    // 数字は2桁なので2文字取り出して整数にしておく
    int num = Integer.parseInt(message.substring(i*2, (i+1)*2));
    sb.append(code.charAt(num-1));
   }
  }else{
   for( int i=0 ; i<message.length() ; i++ ){
    char c = message.charAt(i);
    int num = code.indexOf(c) + 1; // 先頭は01から始まることに注意
    String snum = String.format("%02d", num);
    sb.append(snum);
   }
  }
  return sb.toString();
 }

}

得点は231.19/250、1回のsubmitでシステムテストクリア。先頭の文字が数値か否かを判別するには、asciiで'0'以上'9'以下とするよりも、Character.isDigit(0)を使うと良いでしょう。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計