1. 문제 접근
- 'Z'나 'z'에 13을 더하면, 그 다음 아스키코드 값이 나오는 것이 아니라, 다시 알파벳을 순회해야 한다.
- 따라서 원형 큐를 통해 풀어야겠다고 접근
2. 시행착오
- 문자열을 char 배열에 담을 때, 항상 배열의 크기를 +1해야 오류가 안생긴다는 점을 간과
- C++, C에서 문자는 null로 종료되는 것이 원칙이므로 마지막에 무조건 널문자인
'\0'
에 해당하는 바이트가 붙음
3. 코드 및 풀이
3.1 배열과 원형 큐 방식으로 풀이
- 소문자, 대문자 case를 나눠서 원형 큐 방식으로 접근하도록 했다.
- 예를 들어 만약 'Z'(아스키코드 기준 90) 이 들어오면, 90 - 65('a') + 13의 결과에 mod 26 연산을 해서 'M'이 나오도록 하였음
#include <bits/stdc++.h>
using namespace std;
char arr[101];
string s;
int main(){
getline(cin, s);
for(int i = 0; i < s.size(); i++){
char tmp = s[i];
if ( 'a' <= tmp && tmp <= 'z') arr[i] = (char) ((tmp - 'a' + 13) % 26 + 'a');
else if ('A' <= tmp && tmp <= 'Z') arr[i] = (char) ((tmp - 'A' + 13) % 26 + 'A');
else arr[i] = tmp;
}
for(int i = 0; i < s.size(); i++) {
cout << arr[i] << "";
}
return 0;
}
3.2 단순 조건문
- if 조건문을 여러개 사용해, 바로 결과값을 출력하도록 할 수 있음
- 또한 배열을 사용해 값을 저장하지 않고 바로 출력하는 방식으로 해결할 수 있음
#include<bits/stdc++.h>
using namespace std;
string s;
int main(){
getline(cin, s);
for(int i = 0; i < s.size(); i++){
if(s[i] >= 65 && s[i] < 97){
if(s[i] + 13 > 90) s[i] = s[i] + 13 - 26;
else s[i] = s[i] + 13;
}else if(s[i] >= 97 && s[i] <= 122){
if(s[i] + 13 > 122)s[i] = s[i] + 13 - 26;
else s[i] = s[i] + 13;
}
cout << s[i];
}
return 0;
}
Reference