[JS] Programmers 155652 '둘만의 암호'

서연주·2023년 7월 17일
0

Algorithm

목록 보기
24/25

'둘만의 암호'

Programmers '둘만의 암호' 문제 보러가기

풀이코드

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 사이의 정수를 반환한다.

개선하기

*아잠만 님의 코드를 참고하였습니다.

  1. filter(), include(), 나머지 연산을 사용하여 최종 index 탐색 과정 간소화
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가 그 배열/요소에 방문한 시점의 값이 된다.

참고 자료

profile
pizz@ttang

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

정말 좋은 글 감사합니다!

답글 달기