문제
문자열이 주어질 때, 알파벳을 13자리씩 밀어서 암호화하는 ROT13을 적용한 결과를 출력하라.
입력
문자열이 한 줄로 주어진다 (공백 포함).
출력
ROT13을 적용한 결과를 출력한다.
예제
| 입력 | 출력 |
|---|---|
Baekjoon Online Judge | Onrxwbba Bayvar Whqtr |
풀이
각 문자에 13을 더하고 알파벳 범위를 초과하면 26을 빼서 순환시킨다.
getline으로 공백 포함 문자열을 입력받는다- 소문자이면 13을 더한 뒤
'z'를 초과하면 26을 뺀다 - 대문자이면 13을 더한 뒤
'Z'를 초과하면 26을 뺀다 - 알파벳이 아닌 문자는 그대로 출력한다
핵심 아이디어: ROT13은 알파벳 26자의 절반(13)만큼 밀기 때문에 두 번 적용하면 원문으로 복원된다.
코드
#include <iostream>
#include <string>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string arr;
getline(cin, arr);
for (int i = 0; i < arr.length(); i++)
{
if (arr[i] >= 'a' && arr[i] <= 'z')
{
arr[i] += 13;
if (arr[i] > 'z' || arr[i] < 'a')
{
arr[i] -= 26;
}
}
else if (arr[i] >= 'A' && arr[i] <= 'Z')
{
arr[i] += 13;
if (arr[i] > 'Z')
{
arr[i] -= 26;
}
}
cout << arr[i];
}
}복잡도
- 시간: O(L) (L: 문자열 길이)
- 공간: O(L)