어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
s | n | result |
---|---|---|
"AB" | 1 | "BC" |
"z" | 1 | "a" |
"a B z" | 4 | "e F d" |
function solution(s, n) {
var answer = "";
const sArr = s.split(""); // 들어온 문자 배열로 쪼개기
const large = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const small = "abcdefghijklmnopqrstuvwxyz";
const largeArr = large.split("");
const smallArr = small.split("");
sArr.map((e) => {
if (largeArr.indexOf(e) !== -1) {
answer += largeArr[(largeArr.indexOf(e) + n) % 26];
//입력받은 문자가 대문자인지 파악한 후 맞다면 n만큼 옮겨서 더해주기
}
if (smallArr.indexOf(e) !== -1) {
answer += smallArr[(smallArr.indexOf(e) + n) % 26];
//입력받은 문자가 소문자인지 파악한 후 맞다면 n만큼 옮겨서 더해주기
}
if (e === " ") {
answer += " ";
}
});
return answer;
}
약간의 무식한 방법처럼 보이긴 하지만 일단 풀어서 설명을 해보자면..
대문자와 소문자 알파벳 전부를 배열로 만들고
map을 이용해 n만큼 밀어주었다.
다만 z에서 다시 처음으로 돌아와야 하기 때문에 저번 알고리즘 문제에 나왔던 것 처럼 알파벳 개수인 26으로 나눠준 나머지로 계산!
map 안에서는 먼저 들어온 문자가 대문자인지 소문자인지 파악하고 계속해서 answer에 더해주는 방법을 선택했다.
마지막 예제처럼 공백이 있는 경우는 공백까지 더해주어야 하기 때문에 마지막 if문도 추가!
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;
}
비슷한 느낌이지만 풀이 방법이 훨씬 깔끔했다.
삼항연산자로 대소문자 구문 한 줄로 깔끔하게 끝내고..
n개씩 밀리는 것도 index로 깔끔하게 한 줄로 끝내고
z같은 예외도 아주 깔끔하게 정리가 되어있다..!
많이 풀면 풀 수록 는다는 느낌보다는 아직 한참 멀었다는 생각이 많이 드는 문제였다..!