[프로그래머스][C++] 시저 암호
시저 암호
문제 링크
분석
문제 그대로 문자열을 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)
댓글남기기