문제

 

풀이 코드

function solution(s, n) {
  let asciiCode = s.split('').map((ch) => {
    let asciiNum = ch.charCodeAt() + n;

    if (ch === ' ') return ch;
    return ch.toUpperCase().charCodeAt() + n > 90
      ? String.fromCharCode(asciiNum - 26)
      : String.fromCharCode(asciiNum);
  });
  return asciiCode.join('');
}

 

풀이 과정

어려웟다 아스키를 어떻게 사용해야할지 어떤 조건을 맞춰야 할지 한참을 생각했다.

풀이 과정은 다음과 같이 풀었다

 

1. asciiCode 라는 변수에 Ascii로 변환후, 다음 값을 계산해서 다시 문자로 저장했다.
2. Array.charCodeAt() 함수를 통해 해당 문자의 아스키 코드 값으로 변경할수 있다.
3. 일단, 해당 문자를 대문자로 변환한후, 변환된 문자의 아스키값에 n 만큼 더하여, 이 값이 90보다 크면 ( 'Z' 보다 크면 ) 26을 빼주어, 문자의 범위에서 계산되게 하고, 그렇지 않다면 문자 자체를 반환하게 했다.
4. 핵심은, 조건에서 대문자로 변환하여 이 값이 문자의 범위를 넘기는지 확인하고, 실제 계산할때는 대문자로 변환된 값으로 계산하면 안된다!!!
5. 마지막에 join 함수를 통해 문자열로 만들어 반환해 주었다.

 

다른사람의 풀이

function solution(s, n) {
    var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var lower = "abcdefghijklmnopqrstuvwxyz";
    var answer= '';

    for(var i =0; i <s.length; i++){
        var text = s[i];
        if(text == ' ') {
            answer += ' '; 
            continue;
        }
        var textArr = upper.includes(text) ? upper : lower;
        var index = textArr.indexOf(text)+n;
        if(index >= textArr.length) index -= textArr.length;
        answer += textArr[index];
    }
    return answer;
}

다른 사람은 아스키 코드를 안썻다

코드가 길긴 하지만, 이 코드가 훨씬 가독성 측면에서 좋다고 느껴졌다

 

배열을 이용한 구현이라니

+ Recent posts