function solution(s, skip, index) {
var answer = '';
let alphabet = [];
for(let i=97;i<123;i++){
alphabet.push(String.fromCharCode(i));
}
// 변환하기 편하게 아스키 코드로 변환한다
let shiftS = [];
s=s.split('');
s.forEach(char=>shiftS.push(alphabet.indexOf(char)));
let asciiSkip = [];
skip = skip.split('');
skip.forEach(char => asciiSkip.push(alphabet.indexOf(char)));
// index 횟수 만큼 한 단계씩 s를 변환시킨다.
// 해당 단계의 s에 skip에 해당하는 단어가 있다면 없어질 때까지 변환해준다.
for(let i=0;i<index;i++){
shiftS = shiftS.map((el)=>{
let shift = i !== index ? 1 : 0 ;
while(true){
if(el+shift >= alphabet.length){
shift-=alphabet.length;
}
if(asciiSkip.includes(el+shift) === true){
shift++;
}
else{
break;
}
}
return el+shift;
});
}
shiftS.forEach((ascii)=>{
answer = answer.concat(String.fromCharCode(ascii+97));
})
return answer;
}
📌 includes() - arr.includes(valueToFind[, fromIndex])
; 배열이 특정 요소를 포함하고 있는지 판별한다.
- 대소문자를 구분하여 탐색한다.
- fromIndex: 검색을 시작할 위치
- fromIndex < 0 일 때, 계산된 인덱스 < -1*array.length 라면 전체 배열이 검색된다.- Boolean 값을 반환한다.
📌 charCodeAt() - str.charCodeAt(index)
; 주어진 인덱스에 대한 UTF-16 코드를 나타내는 0부터 65535 사이의 정수를 반환한다.
*아잠만 님의 코드를 참고하였습니다.
function solution(s, skip, index) {
var answer = '';
let alphabet = [];
for(let i=97;i<123;i++){
alphabet.push(String.fromCharCode(i));
}
// skip 해야할 문자 삭제
alphabet = alphabet.filter(char => !skip.includes(char));
s = s.split('');
// 최종 알파벳으로 변환
answer = s.map(char => alphabet[(alphabet.indexOf(char) + index) % alphabet.length]).join("");
return answer;
}
📌 filter() - arr.filter(callback(element[, index[, array]])[, thisArg])
; 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환한다.
- callback: 각 요소를 시험할 함수. true를 반환하면 유지하고 false를 반환하면 버린다.
- 호출되는 배열을 변화시키지(mutate) 않는다.
- callback에 전달된 방문 배열/요소는 filter가 그 배열/요소에 방문한 시점의 값이 된다.
정말 좋은 글 감사합니다!