어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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" |
function solution(s, n) {
//s에서 문자 하나하나 추출
//charCodeAt 사용해서 유니코드 변환
//+n만큼 밈, a 다음은 z가 되도록, 공백은 그대로 있도록 조건
//fromCharCode 이용해서 다시 변환
return s.split('').map((v)=> {
const num = v.charCodeAt();
return String.fromCharCode(
(num >= 65 && num <= 90 && num + n > 90) ||
(num >= 97 && num<= 122 && num + n > 122)? num + n - 26:
v === ' '? num:
num + n
)
}).join('')
}
그냥 아스키코드를 이용해서 풀어 줬다.
n이 25이하이므로 두번 돌지는 않는다. 그래서 대문자이고 아스키코드로 변환한 숫자가 Z이상일 때, 소문자이고 아스키코드로 변환한 숫자가 z이상일 때 26을 빼준다. 값이 공백일때는 그대로 인출해주고 아무것에도 해당하지 않으면 번호에 n을 더해 줬다.
function solution(s, n) {
var chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY "
return s.split('').map(e => chars[chars.indexOf(e)+n]).join('');
}
아스키코드를 이용하지 않고 문자를 알파벳순으로 소문자 두번 대문자 두번을 써줬다. 그리고 index값에 n을 더한 값을 인출해 준다. 단순무식한 방법이라고 생각했는데 n이 25를 넘지 않으므로 오히려 직관적이고 이해하기 쉬운 것 같다.
function solution(s, n) {
//변수 선언
var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var lower = "abcdefghijklmnopqrstuvwxyz";
var answer= '';
//문자 값이 공백일 때는 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;
}
대문자 배열과 소문자 배열을 따로 선언한 경우이다. continue
를 사용하여 문자가 공백인 경우에는 if문을 종료하고 다시 반복문으로 돌아가도록 만들어 줬다.