반응형
알고리즘 문제 푸는 거 생각보다 재밌다.
문제요약
ROT13은 카이사르 암호의 일종으로 영어 알파벳을 13 글자씩 밀어서 만듦.
알파벳은 26자. 암호화하기 위해 13글자를 밀고 복호화를 위해 다시 ROT13을 사용하면 됨.
ROT13은 알파벳 대문자와 소문자에만 적용 가능, 알파벳이 아닌 경우 암호화가 되면 안 됨.
입력
첫째 줄에 알파벳 대문자, 소문자, 공백, 숫자로만 이루어진 문자열(길이는 100을 넘지 않음)
출력
S를 ROT13으로 암호화한 내용을 출력
풀이
우선 문자열을 순회하면서 알파벳 여부를 확인하는 함수가 필요하다.
bool isAlphabet(char ch){
return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'));
}
이후 알파벳이면 ROT13 암호화를 적용하는 함수를 실행하면 더 깔끔할 것 같다.
아스키코드를 이용해 알파벳을 순환시키려면 몇 가지 방법이 더 추가되어야 한다.
알파벳에서 자신의 순서를 가져와야 한다. 이를 위해선 대문자와 소문자를 구별해서 진행해야 한다.
ch - 'a' or ch - 'A'이 차이는 시작점 a, A에서 자신의 위치까지의 거리이다.
이 거리에 13을 더했을 때 값을 알파벳의 총거리로 나눈 나머지 값을 구하면 이 값은 a, A에서 부터 암호화된 알파벳의 위치를 나타낸다.
이제 이 위치를 다시 알파벳으로 변환해주어야 하므로 기준점에서 이 값을 더해준다.
void ROT13(char& ch){
if((ch >= 'a' && ch <= 'z')){
ch = (((ch - 'a') + 13) % 26) + 'a';
}else if((ch >= 'A' && ch <= 'Z')){
ch = (((ch - 'A') + 13) % 26) + 'A';
}
}
처음에 단순히 13을 더해줬다가 범위를 넘어가는 아스키코드가 출력되어 순환을 생각하고 다시 풀었던 문제이다.
#include <bits/stdc++.h>
using namespace std;
bool isAlphabet(char ch){
return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'));
}
void ROT13(char& ch){
if((ch >= 'a' && ch <= 'z')){
ch = (((ch - 'a') + 13) % 26) + 'a';
}else if((ch >= 'A' && ch <= 'Z')){
ch = (((ch - 'A') + 13) % 26) + 'A';
}
}
string s;
int main() {
getline(cin, s);
for(char& c: s) {
if(isAlphabet(c)) ROT13(c);
}
cout << s << '\n';
return 0;
}
tip
띄어쓰기를 포함한 문자열을 받기 위해선 getline 함수를 사용했다.
반응형
'자료구조와 알고리즘 > 알고리즘' 카테고리의 다른 글
2559 (0) | 2023.07.06 |
---|---|
9996 (0) | 2023.07.04 |
농구 경기(1159) (0) | 2023.07.02 |
Palindrome (0) | 2023.07.02 |
트럭 주차 (0) | 2023.07.01 |
댓글