우선 해당 문자열을 처리하기 위해 기존의 문자열을 split해준 후 배열에 할당하고, 배열을 순회 하면서 배열의 현재 요소가 공백이 아닐 때 조건문에 들어갑니다.
그 후 charCode 변수에 배열의 현재 문자열을 charCodeAt으로 변환한 값에 n(밀어내는 값)을 더한 후 할당합니다.
그리고 그 안에 두번째 조건문을 걸어주는데, arr의 현재 요소(i)에 문자가 대문자의 범위(A to Z)인 경우와 소문자(a to z)인 경우로 나누고, 각각 그 조건문들 안에서 또 해당 charCode의 값이 각각 Z와 z의 유니코드를 넘어간 경우, -26을 각각 빼줘서 처음으로 돌아오도록(A와 a로 돌아오도록) 해준 후 그 값을 arr의 현재 요소(i)에 할당합니다.
물론 공백일 경우에는 애초부터 첫번째 if문에 걸리지 않으므로 공백이면 그냥 넘어가겠죠. 그리고 배열을 split 하기 전에 trim으로 양쪽 공백을 삭제하려 했는데, 생각을 해보니 주어진 s에 공백이 양쪽이나 한 곳에 생기면 그것도 그대로 출력을 해주어야 하기에 trim은 시켜주지 않았습니다. (실제로 trim을 해주니 테스트케이스 세 개가 틀리더군요.)
아무튼 그렇게 배열 작업이 끝나면 join으로 문자열로 묶어주고 반환합니다.
function solution(s, n) { let arr = s.split(''); for(let i = 0; i < arr.length ; i++){ if(arr[i] !== " "){ let charCode = arr[i].charCodeAt(0) + n; if(arr[i] >= "A" && arr[i] <= 'Z'){ if(charCode > 'Z'.charCodeAt(0)){ charCode -= 26 arr[i] = String.fromCharCode(charCode); }else{ arr[i] = String.fromCharCode(charCode); } }else if(arr[i] >= "a" && arr[i] <= 'z'){ if(charCode > 'z'.charCodeAt(0)){ charCode -= 26 arr[i] = String.fromCharCode(charCode); }else{ arr[i] = String.fromCharCode(charCode); } } } } return arr.join("") }