[JS] 시저 암호

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

charCodeAt( idx )

문자열에서 특정 위치에 있는 문자의 유니코드 값(숫자)

let str = "Hello";
let code = str.charCodeAt(0); // 0번 인덱스
console.log(code); // 출력: 72 ('H'의 유니코드 값)

 

fromCharCode

유니코드 값에 해당하는 문자 반환

let charCode = 65;
let char = String.fromCharCode(charCode);
console.log(char); // 출력: 'A'

 

먼저 유니코드의 자주쓰는 숫자는 다음과 같다

32 : 공백
48~57 : 숫자
65~90 : 대문자
97~122 소문자

 

 

그래서 코드를 대문자 케이스로 설명 하면,

 

1. 각 문자의 유니코드를 비교해서 해당 문자가 'A'(65) ~ 'Z'(90) 사이이면 조건문에 들어간다

 

2. 해당 문자의 유니코드를 구하고(s.charCodeAt(i)), 기준이 되는 'A'의 유니코드를 뺀다

    예를 들면, s[i]가 'C'이면 s.charCodeAt(i)는 67을 반환한다

    'A'가 65이므로, 'A'는 0, 'B'는 1, ... , 'Z'는 25가 되고, 'C'는 2가 된다

 

3. n만큼 넘어간 걸 구하기 위해, n을 더한다 

 

4. 알파벳은 총 26글자이므로, 넘어가는 범위를 처리하기 위해 26으로 나눈 나머지를 구한다

 

5. 다시 대문자로 바꾸기 위해 기준이 되는 'A'의 유니코드를 더한다

 

6. fromCharCode를 통해 구한 유니코드 값을 문자로 반환한다

 

7. 문자만큼 반복.. 

function solution(s, n) {
    let answer = '';
    for (let i = 0; i < s.length; i++) {
        if (s[i] >= 'A' && s[i] <= 'Z') { // 대문자
            answer += String.fromCharCode((s.charCodeAt(i) - 'A'.charCodeAt(0) + n) % 26 + 'A'.charCodeAt(0));
        } else if (s[i] >= 'a' && s[i] <= 'z') { // 소문자
            answer += String.fromCharCode((s.charCodeAt(i) - 'a'.charCodeAt(0) + n) % 26 + 'a'.charCodeAt(0));
        } else { // 알파벳이 아닌 경우
            answer += s[i];
        }
    }
    return answer;
}