ALGORITHM/PROGRAMMERS

[프로그래머스] 시저 암호 | javascript

heeney 2021. 7. 28. 23:36
728x90

[프로그래머스] 시저 암호 | javascript level 1

문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

제한 조건

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

입출력 예

s n result
"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

작성한 코드

function solution(s, n) {
    return s.split('').map(v => {
        if(v === ' ') return v;
        return v.toUpperCase().charCodeAt()+n > 90 ? String.fromCharCode(v.charCodeAt()+n-26) : String.fromCharCode(v.charCodeAt()+n)
    }).join('');
}
map

요소를 이용해 새로운 배열을 생성하고 원본 배열과 똑같은 길이의 배열을 생성합니다.

charCodeAt()

해당하는 문자의 아스키코드 값(숫자)를 반환합니다.

fromCharCode()

해당하는 아스키코드 값(숫자)의 문자를 반환합니다.

설명: split 으로 문자열을 나누었을때 띄어쓰기가 포함되어 있으므로 띄어쓰기가 있으면 그대로 return 합니다.
그게 아니라 문자라면 두번째 줄로 넘어가는데 해당 문자를 대문자로 바꿔서 문자를 아스키코드로 변환하고 n을 더했을때 90(아스키코드에서 Z에 해당) 초과라면 값을 나타낼 수 없습니다. 그 예외를 걸러주기 위해 사용된 코드입니다.
예를 들어서 s가 Z(90)이고 n이 1이라고 가정하면 91입니다. A(65)를 출력해야하는데 예외처리 없이 계산하면 91은 '[' 입니다. 원하는 답이 아니죠? 아스키코드가 a-z 안에서 계속 돌아야하기 때문에 사용된 예외처리입니다.

그래서 만약 90을 초과한다면 해당 값에서 26(알파벳 갯수)을 빼주고 그게 아니라면 n을 더한 그 값만 return 해주면 됩니다.

아스키코드 https://asciichart.com/
 

Decimal ASCII Chart

Decimal ASCII Chart Decimal ASCII Chart 0NUL16DLE32SP48064@80P96`112p 1SOH17DC133!49165A81Q97a113q 2STX18DC234"50266B82R98b114r 3ETX19DC335#51367C83S99c115s 4EOT20DC436$52468D84T100d116t 5ENQ21NAK37%53569E85U101e117u 6ACK22SYN38&54670F86V102f118v 7BEL23ETB

asciichart.com

 

다른 분의 코드

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

아스키코드를 사용하지 않고 답을 도출해낸 코드입니다.

 

 

728x90