- 알파벳은 26개이므로 k의 값을 26으로 나눈 나머지로 초기화한다.
- string의 각 문자를 돌면서 대문자와 소문자를 구별한다.
- k만큼 뒤로 민 인덱스가 'z', 'Z' 보다 클 경우 26을 빼주어서 알파벳 범위 내에 있도록 유지한다.
ex. k = 3 x (120) 의 경우 x+k = 123 이므로 z(122) 를 넘는다. 알파벳 개수인 26을 빼주면 a(97)이 된다.
string caesarCipher(string s, int k) {
k = k % 26;
for(int i=0; i<s.length(); i++)
{
if (s[i] >= 'a' && s[i] <= 'z')
{
if ((int)'z' < (int)(s[i] + k))
s[i] += k - 26;
else
s[i] += k;
}
else if (s[i] >= 'A' && s[i] <= 'Z')
{
if ((int)'Z' < (int)(s[i] + k))
s[i] += k - 26;
else
s[i] += k;
}
}
return s;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
int k;
cin >> k;
k %= 26;
for (int i = 0;i < n; i++) {
int c = s[i];
if (c >= 'a' && c <= 'z') { // Lowercase characters
c += k;
if (c > 'z') { // C exceeds the ascii range of lowercase characters.
c = 96 + (c % 122); // wrapping from z to a
}
} else if(c >= 'A' && c <= 'Z') { // Uppercase characters
c += k;
if(c > 'Z') { // C exceeds the ascii range of uppercase characters.
c = 64 + (c % 90); //wrapping from Z to A
}
}
cout << (char)c;
}
cout << endl;
return 0;
}
A
와 새로 구한 문자를 Z로 나눈 나머지
를 더해서 감쌌다.