문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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"
문제풀이
const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
function solution(s, n) {
let answer = "";
for(let i =0; i <s.length; i ++){
if(s[i] === " "){
answer += s[i]
continue;
}
let idx = alphabet.indexOf(s[i])
const words = idx < 26 ? alphabet.substring(0, 26) : alphabet.substring(26)
idx = words.indexOf(s[i]) + n
if(words[idx] === undefined){
idx -= 26;
}
answer += words[idx]
}
return answer;
}
접근방법
1. s와 n값을 찍어본다.
2. 알파벳을 나열해서 한칸씩 밀면 뭐가 나오는지 확인한다.
3. 그러기 위해 알파벳순서대로 모은 변수를 생성한다.
4. 소문자와 대문자를 구분한다.
5. 정답을 담을 변수를 생성한다.
6. s의 길이만큼 반복문을 돌린다.
7. 문자열을 자를 때 사용하는 substring, slice 중 사용한다.
8. 전체문자열에서 소문자 a는 0번째 부터 시작한다.
9. 소문자가 끝나는 시점은 z위치에 있는 인덱스!
10. console.log(s[i],alphabet.indexOf(s[i])) 해보면
해당 알파벳의 위치를 알 수 있다.
다른방법
const lower = "abcdefghijklmnopqrstuvwxyz";
const upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
function solution(s, n) {
let answer = "";
for(let i =0; i <s.length; i ++){
if(s[i] === " "){
answer += s[i];
continue;
}
const words = lower.includes( s[i] ) === true ? lower : upper;
let idx = words.indexOf(s[i]) + n;
if(idx > 25){
idx -= 26;
}
answer += words[idx]
}
return answer;
}
메소드활용
const lower = "abcdefghijklmnopqrstuvwxyz";
const upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
function solution(s, n) {
return s.split("")
.reduce( (acc,cur)=>{
const words = lower.includes(cur) ? lower: upper;
let idx = words.indexOf(cur) +n
if( !words[idx] ){
idx -= 26;
}
return acc + (
cur === " " ? " " : words[idx]
)
},"")
}
function solution(s, n) {
let answer = "";
for(let i = 0; i <s.length; i++){
let idx = s[i].charCodeAt() + n;
if(idx > 122 || (idx > 90 && (idx - n) < 97 )){
idx -= 26;
}
answer += s[i] === " " ? " " : String.fromCharCode(idx)
}
return answer
}