시저 암호

NJW·2021년 8월 21일
0

코테

목록 보기
66/170

들어가는 말

알파벳을 주어진 n만큼 뒤로 밀어서 암호화하는 것을 시저 암호라고 한다. a를 1개 밀면 b가 되고 z를 2개 밀면 b가 되는 것과 같은 이치다. 이때, 공백은 그냥 유지한다.

코드 설명

반복문 for을 0부터 문자열 끝가지 돌린다. 값이 공백일 경우 continue로 암호화를 생략해준다. 먼저 대문자인지 소문자인지부터 구분했다. 대문자이면서 n만큼 미뤘을 때 범위를 벗어난다면 s[i] - 'Z' + 'A' + n -1로 밀어 준다. 예를 들어 알파벳이 x이고 5만큼 미뤘다고 할 때, 88 - 90 + 65 + 5 - 1로 67이 된다.
조금 더 자세히 설명하자면, 88을 90(Z의 값)으로 빼면 X뒤에 얼마나 있는지가 나온다(Y와 Z가 있으므로 2개). 거기다 65(A의 값)을 더해주면 63으로 뒤에 있는 값만큼 앞으로 나오게 된다. 그 다음 n만큼 미뤄주고 1을 빼주면 된다.
복잡하게 됬는데, 직관적으로 본다면 쉽게 알 수 있다.
소문자도 대문자 구하는 방식과 같이 해주면 된다.

코드

#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    
    for(int i = 0; i < s.size(); i++){
        if(s[i] == ' '){
            continue;
        }else if(s[i] >= 'A' && s[i] <= 'Z'){
            if(s[i] + n > 'Z'){
                s[i] = s[i] - 'Z' + 'A' + n - 1;
            }else{
                s[i] = s[i] + n;
            }
        }else if(s[i] >= 'a' && s[i] <= 'z'){
            if(s[i] + n > 'z'){
                s[i] = s[i] - 'z' + 'a' + n - 1;
            }else{
                s[i] = s[i] + n;
            }
        }
    }
    return s;
    
}
profile
https://jiwonna52.tistory.com/

0개의 댓글