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;
}