2012年4月19日木曜日

TopCoder SRM378 Div2 250Pts

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

小文字と空白のみからなる文字列messageを暗号化する。まずaからzまでの26文字の並びを先頭からfirstSize番目の文字で切って、二つのグループに分ける。次に対応表を作る。先頭のグループはfirstRoteteだけ後ろにずらし(最後方の文字は先頭に移動する)、後半のグループはsecondRoteteだけ後ろにずらす。messageはこのずらしたあとの対応表を基に暗号化する。例えばfirstSize=3、firstRotete=1、secondRotete=0、message="abcde"であれば、abcはbcaとずれることになるので、"abcde"は"bcade"となる(deはsecondRoteteが0なので文字の暗号化は行われない)。暗号化対象のmessage、アルファベット26文字をグループに分ける際に用いられるfirstSize、2つの文字のグループで文字を移動させるfirstRotete、secondRoteteが与えられたとき、messageを暗号化した結果を文字列で返せ。

私の解答はこちら。

public class TwoRotationCypher {

 public String encrypt(int firstSize, int firstRotate, int secondRotate, String message) {
  StringBuilder sb = new StringBuilder();
  for( int i=0 ; i<message.length() ; i++ ){
   char c = message.charAt(i);
   if( c == ' ' ){
    sb.append(' ');
    continue;
   }
   if( c-'a' < firstSize ){ // cがfirst groupに入る場合
    int pos = (c-'a'+firstRotate) % firstSize;
    sb.append((char)('a'+pos));
   }else{
    int pos = (c-'a'-firstSize-1+secondRotate) % (26-firstSize) + firstSize + 1;
    if( pos == 26 ) pos = firstSize;
    sb.append((char)('a'+pos));
   }
  }
  return sb.toString();
 }

}

得点は108.91/250、1回のsubmitでシステムテストクリア。境界値で嵌りました。pos==26という行が後付の箇所です。余りを利用して綺麗に書けないかなとは思うのですが...

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計