[HackerRank/C++] Caesar Cipher

2023. 3. 2. 13:49코딩테스트 해커랭크/Algorithms -Easy

문자열 s와 정수 k를 받을때, s의 알파벳을 k만큼 더해서 return 한다

 

string caesarCipher(string s, int k)
{
    k = k % 26;
    
    for (int i = 0; i < s.size(); ++i)
    {
        if ('a' <= s[i] && s[i] <= 'z')
        {
            if ((int)'z' < (int)s[i] + k)
                s[i] += (k - 26);
            else
                s[i] += k;
        }
        else if ('A' <= s[i] && s[i] <= 'Z')
        {
            if ((int)'Z' < (int)s[i] + k)
                s[i] += (k - 26);
            else
                s[i] += k;
        } 
    }
    
    return s;
}

알파벳의 갯수는 26개이므로 k의 값이 26보다 클 경우 어차피 값에 변화가 없으므로 k는 26을 나눈 나머지 값으로 갱신한다

 

s의 모든 문자열을 순회하며 알파벳인지 체크하며, 알파벳이라면 k만큼 알파벳을 밀어낸다

 

ascii 값을 보면 소문자 z는 122의 값을 가지고 있다

 

따라서 s의 해당 인덱스에 k만큼 더하고 z의 값인 122보다 클 경우 26만큼 빼주는 방법은 char값을 넘어선 오버플로우 때문에 제대로 동작하지 않을 확률이 아주 높다

 

그러므로 미리 해당 인덱스와 k의 값을 더해 'z'보다 큰 값일 경우 (k - 26)만큼을 더해주는 방법으로 값을 수정한다

 

대문자의 경우에도 똑같이 적용시킨다

 

그리고 그 문자열을 return 한다