문제

코드
function solution(s, n) {
let answer = '';
const upperA = 65, upperZ = 90, lowerA = 97, lowerZ = 122, alphabet = 26;
s.split('').forEach(element => {
let code = element.charCodeAt(0);
if(code >= upperA && code <= upperZ) {
code += n;
if(code > upperZ) code -= alphabet;
}
if(code >= lowerA && code <= lowerZ) {
code += n;
if(code > lowerZ) code -= alphabet;
}
answer += String.fromCharCode(code);
})
const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
lower = 'abcdefghijklmnopqrstuvwxyz',
alphabet = upper.length;
s.split('')
.forEach(element => {
if(element === ' ') {
answer += ' ';
return;
}
const state = upper.includes(element) ? upper : lower;
let index = state.indexOf(element) + n;
if(index > alphabet-1) index -= alphabet;
answer += state[index];
})
return answer
}
아스키코드를 이용한 풀이
문자열.charCodeAt(index)
- 값이 있다면 해당 값의 아스키코드 숫자 반환
- 없다면 NaN 반환
String.fromCharCode(코드번호)
- 풀긴 했지만 코드가 for와 if로 도배되어 지저분하다.(사실 두 번째 코드도 지저분하다.)
includes와 indexOf를 이용한 풀이
- 어차피 알파벳은 변하지 않는 상수니까 대소문자 선언해둔다.
- upper.includes(문자)의 값이 있으면 대문자 아니면 소문자
- 어떤 알파벳인지는 index를 계산하고 +n
- n은 0~25지만 alphabet은 1~26. 따라서 비교할 때 alpahbet-1을 해줌
forEach 멈추기
- forEach는 return;을 이용해 continue한다.
참고 사이트