HackerRank/Algorithms

[HackerRank] Strings > Caesar Cipher

ruming 2021. 8. 26. 15:43

카이사르 암호를 구현하는 문제이다.

카이사르 암호는 알파벳을 지정한 수만큼 움직여 암호화하는 기법이다.

 

대문자와 소문자를 문자열에 저장해 두고 그 안에서 돌릴 수 있을까 생각해봤는데 반복문이 많이 돌아가면 더 복잡해질 것 같아 경우의 수를 나누어서 더해주었다.

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를 더해주었다. (오버플로우 방지)