카이사르 암호를 구현하는 문제이다.
카이사르 암호는 알파벳을 지정한 수만큼 움직여 암호화하는 기법이다.
대문자와 소문자를 문자열에 저장해 두고 그 안에서 돌릴 수 있을까 생각해봤는데 반복문이 많이 돌아가면 더 복잡해질 것 같아 경우의 수를 나누어서 더해주었다.
char* caesarCipher(char* s, int k) {
int i, n = strlen(s);
for(i=0; i<n; i++){
if(s[i]>='A'&&s[i]<='Z'){
if(k>=26) k%=26;
if(s[i]+k>'Z') s[i] -= 26;
s[i] = s[i]+k;
}
if(s[i]>='a'&&s[i]<='z'){
if(k>=26) k%=26;
if(s[i]+k>'z') s[i] -= 26;
s[i] = s[i]+k;
}
}
return s;
}
암호문에서 대문자와 소문자를 구분했다. s[i]에 k를 더한 값이 char 범위를 넘어가면 오버플로우가 나므로 주의해야 한다. 먼저 26씩 반복되므로 k를 26으로 나눈 나머지로 바꿨다. 그리고 s[i]+k가 'Z'를 넘으면 26을 먼저 빼고 k를 더해주었다. (오버플로우 방지)
'HackerRank > Algorithms' 카테고리의 다른 글
[HackerRank] Implementation > Divisible Sum Pairs (0) | 2021.09.12 |
---|---|
[HackerRank] Sorting > Counting Sort 2 (0) | 2021.09.12 |
[HackerRank] Strings > Strong Password (0) | 2021.08.26 |
[HackerRank] Strings > Pangrams (0) | 2021.08.26 |
[HackerRank] Search > Ice Cream Parlor (0) | 2021.08.26 |