けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

JOI 予選 2007 C - シーザー暗号 (AOJ 0512, 難易度 2)

アルファベットを戻す処理を書くのが最初は難しいかもしれない

問題概要

シーザー暗号とは、文字列に対して、各文字を 3 つずつ進めたものに変換するものである。ただし、X, Y, Z はそれぞれ A, B, C となる。具体的には、次のようなる。

  • 変換前 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  • 変換後 D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

ある文字列がシーザー暗号化された文字列  S が与えられるので、それを復号化した文字列を出力せよ。

解法

アルファベットを 3 つ戻す処理が実装できればよい。その方法は、公式解説に詳しく書いてある。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    string S;
    cin >> S;
    
    // 各文字について処理
    for (int i = 0; i < S.size(); ++i) {
        // その文字がアルファベットで何番目かを知る ('A' を 0 とする)
        int order = S[i] - 'A';
        
        // 3 つ前に戻す (ここが少し難しいかもしれない)
        int new_order = (order - 3 + 26) % 26;
        
        // その文字を復元する
        char c = 'A' + new_order;
        S[i] = c;
    }
    
    cout << S << endl;
}