2012年4月7日土曜日

TopCoder SRM364 Div2 250Pts

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

マージは息子が時間をすごしている不良たちについてかなり心配している。アーケードですべての時間を過ごしていることは別として、彼らは暗号化されたメッセージで互いにコミュニケーションをとっている。心配している親として、マージは彼らが何について話しているのかということを知りたいと思っている。マージは彼らの暗号ライブラリをしっており、文字列型配列library[]にそれが与えられる。library[]の各要素は"アルファベットの大文字1文字 暗号化前の文字列"という形式をとっている(半角1文字で区切られている)。マージはmessageという暗号化されたメッセージからlibrary[]を用いて元の文章に戻そうとしている。ただし、マージはすべての単語に対応するライブラリを持っていないため、対応しない単語がmessageに現れてしまうことがある。その場合は"?"で単語を埋めることになる(マージは賢い母親なので、断片的な情報から単語が何か理解できるのである)。messageを復号化した結果を返すメソッドを作成せよ。

私の解答はこちら。

import java.util.HashMap;
import java.util.Iterator;

public class MorselikeCode {

 public String decrypt(String[] library, String message) {
  String[] msgArray = message.split(" ");
  // 大文字と単語はハッシュで対応づけておく
  HashMap<String, String> hm = new HashMap<String, String>();
  for( int i=0 ; i<library.length ; i++ ){
   String[] tmp = library[i].split(" ");
   hm.put(tmp[1], tmp[0]); // 順番注意!
  }
  StringBuilder sb = new StringBuilder();
  for( int i=0 ; i<msgArray.length ; i++ ){
   Iterator<String> it = hm.keySet().iterator();
   boolean isExist = false; // library[]に対応する単語はあるか?
   while( it.hasNext() ){
    String tmp = it.next();
    if( tmp.equals(msgArray[i]) ){
     sb.append(hm.get(tmp));
     isExist = true;
     break;
    }
   }
   if( !isExist ) sb.append("?");
  }
  return sb.toString();
 }

}

得点は199.27/250、中央値は約126点。1回のsubmitでシステムテストクリア。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計