문제

코드

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한다.

참고 사이트

profile
쿼카에요

0개의 댓글