어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
공백은 아무리 밀어도 공백입니다.
s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
s의 길이는 8000이하입니다.
n은 1 이상, 25이하인 자연수입니다.
s n result
"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"
우선 문자열을 배열에 쪼개 담고 map으로 하나씩 변환하려고 한다.
(문자를 밀기 위해) 문자를 아스키 코드로 변환해서 주어진 숫자(n)를 더해주면 크게 두 가지 케이스로 분류할 수 있다.
문자를 아스키 코드로 바꾸어서 n을 더해주었을 때, 알파벳 범위를 넘어가면 이상한 기호들이 출력된다. 따라서 알파벳 범위를 벗어날 때는 다시 a/A부터 시작하도록 해주어야 한다.
이때, 대/소문자에 따라 아스키코드가 다르므로 구별하여 체크해준다.
(z의 아스키코드는 122, Z의 아스키코드는 90이다.)
위와 같이 알파벳 범위를 벗어나는 경우에는 n을 더한 값에서 26을 빼서 문자로 바꾸어 준다.
(알파벳 갯수가 25개이기 때문.)
n을 더해도 알파벳 범위를 벗어나지 않으면 그냥 n을 더해주면 된다.
이때 유의해야 할 점은 공백
이다.
공백에 n을 더해주면 공백이 유지되지 않고 다른 기호로 바뀌기 때문에 공백 부분에는 n을 더해주면 안된다.
따라서 아래처럼 분류해주면 된다.
참고 ) 아스키 코드표
function solution(s, n) {
return s.split("")
.map((val) =>
val.match(/^[a-z]/g) && val.charCodeAt() + n > 122 || val.match(/^[A-Z]/g) && val.charCodeAt() + n > 90
? String.fromCharCode(val.charCodeAt() + n - 26)
: val.match(/\s/g) ? ' ' : String.fromCharCode(val.charCodeAt() + n)
)
.join("");
}
공백 포함 체크 : string.match(/\s/g)
문자를 아스키코드로 바꾸기: string.charCodeAt(index)
아스키코드를 문자로 바꾸기 : String.fromCharCode(아스키코드)
대소문자 알파벳을 직접 써서 위치를 찾아주는 방법도 있다.
function solution(s, n) {
var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var lower = "abcdefghijklmnopqrstuvwxyz";
var answer= '';
for(var i =0; i <s.length; i++){
var text = s[i];
if(text == ' ') {
answer += ' ';
continue;
}
var textArr = upper.includes(text) ? upper : lower;
var index = textArr.indexOf(text)+n;
if(index >= textArr.length) index -= textArr.length;
answer += textArr[index];
}
return answer;
}