시저 암호

문제 링크

시저 암호

분석

문제 그대로 문자열을 n만큼 민 값을 반환해야합니다.
여기서 밀다는 각 인덱스의 문자를 n만큼 증가한 값입니다.

아스키코드의 값을 이해해야 문제를 풀 수 있습니다.

제한사항의 조건에 대해 모두 if문을 걸어 풀이 할 수 있습니다.

소문자와 대문자를 각각 기준으로 n만큼 이동한 값을 통해 풀이 할 수 있습니다.

해당 문제에서는 소문자 ‘a’와 대문자 ‘A’를 기준으로 따로 처리하며, n만큼 이동한 값을 풀이하도록 하겠습니다.

풀이

#include <string>

std::string solution(std::string s, int n) {
    std::string answer = "";
    answer.reserve(s.length());
    
    for (int i = 0; i < s.length(); ++i)
    {
        if (' ' == s[i])
        {
            answer += ' ';
            continue;
        }
        
        int shifted = ('a' > s[i]) ? s[i] - 'A' : s[i] - 'a';

        
        shifted += n;
        shifted %= 26;
        
        answer += ('a' > s[i]) ? 'A' + shifted : 'a' + shifted;
    }
    
    return answer;
}

answer.reserve(s.length())에서 미리 문자열의 길이를 예약했습니다.

첫 if문에서 공백을 처리합니다.

char shifted = ('a' > s[i]) ? s[i] - 'A' : s[i] - 'a'에서 기준이 되는 ‘a’와 ‘A’에서 s[i]에 대한 상대적 위치를 구합니다.
구한 값에 n만큼 이동시킵니다.

알파벳은 총 26개이므로, 이동한 값이 범위를 초과하지 않도록 나머지 연산자(%)를 사용해 ‘z’ 혹은 ‘Z’를 넘기지 않게해줍니다.

answer += ('a' > s[i]) ? 'A' + shifted : 'a' + shifted는 기준이 되는 문자에서 이동을 시키는 코드입니다.

성능 요약

테스트 1 〉 통과 (0.01ms, 4.21MB)
테스트 2 〉 통과 (0.01ms, 4.22MB)
테스트 3 〉 통과 (0.01ms, 4.19MB)
테스트 4 〉 통과 (0.01ms, 4.14MB)
테스트 5 〉 통과 (0.01ms, 4.2MB)
테스트 6 〉 통과 (0.01ms, 4.21MB)
테스트 7 〉 통과 (0.01ms, 3.68MB)
테스트 8 〉 통과 (0.01ms, 4.18MB)
테스트 9 〉 통과 (0.01ms, 3.65MB)
테스트 10 〉 통과 (0.01ms, 4.14MB)
테스트 11 〉 통과 (0.01ms, 3.68MB)
테스트 12 〉 통과 (0.01ms, 4.2MB)
테스트 13 〉 통과 (0.07ms, 4.22MB)

Programmers 카테고리 내 다른 글 보러가기

댓글남기기