PR - 시저 암호

goody·2021년 2월 26일
0

알고리즘

목록 보기
54/90

문제

지난 풀이 참고

예시

지난 풀이 참고

풀이

  • 지난 풀이에서는 알파벳을 유니코드로 변환해서 풀려다 보니 유니코드 값이 소문자 혹은 대문자의 범위를 벗어나는 문제가 있었다.
  • 그래서 이번에는 미리 소문자와 대문자들을 배열에 정의해놓고, 매개변수로 받은 문자열을 한 글자씩 검사하는 로직을 선택했다.
  • 우선 주어진 문자열의 글자가 대문자 배열과 소문자 배열중 어느 배열에 속하는지 검사한다.
  • 해당 배열 내에서 주어진 글자의 위치(인덱스)를 찾고, n만큼 인덱스를 더한다.
  • 만약 더해진 인덱스가 배열의 크기를 넘어가면 더해진 인덱스 -= 배열 길이 로 다시 인덱스를 배열의 맨 처음부터 시작하게 한다.

코드

function solution(s, n) {
    const ABC = ["A","B","C","D","E","F","G","H","I","J","K","L",'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
    const abc = ABC.map((el) => el.toLowerCase());
    let answer = "";
    const arr = s.split("");
    
    arr.forEach((el) => {
        if(ABC.indexOf(el) !== -1) {
            const idx = ABC.indexOf(el);
            let newIdx = idx + n;
            if(newIdx >= ABC.length) newIdx = newIdx - ABC.length; 
            answer += ABC[newIdx];
        }
        else if(abc.indexOf(el) !== -1) {
            const idx = abc.indexOf(el);
            let newIdx = idx + n;
            if(newIdx >= abc.length) newIdx = newIdx - abc.length; 
            answer += abc[newIdx];
        } else {
            answer += el;
        }
    })

    return answer;
}

0개의 댓글