ALGORITHM/PROGRAMMERS

[프로그래머스] 시저 암호 - JavaScript

thisisyjin 2022. 7. 7. 11:53

javascript

문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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) {
// 소문자 97~122 / 대문자 65~90 / 공백이면 공백
    let answer = '';
    let asc = 0;
    for (let i of s) {
        if (i === ' ') answer += ' ';
        else {
            asc = i.charCodeAt();;
            if (asc >= 65 && asc <= 90 && asc+n > 90 || asc >= 97 && asc <= 122 && asc+n > 122) asc -= 26;
            answer += String.fromCharCode(asc+n);
        }
    }
    return answer;
}

이 문제는 아스키코드를 이용해서 풀이해보았다.
for...of문으로 문자열의 각 글자를 if-else문으로 검사한다.
만약 i가 공백이면 그대로 공백을 리턴한다.
i.charCodeAt()을 한 결과인 asc의 값이 65~90 사이이면서 n을 더한 값이 90보다 크면 (z 보다 커지면)
a로 다시 넘어가야 하므로 -26을 해준다. (소문자도 마찬가지이다.)
그렇게 한 후 전부 asc + n을 해준 숫자를 String.fromCharCode()의 인자로 넣어준 후 answer에 더해준다.

실행 결과

테스트 1 〉    통과 (0.07ms, 30.1MB)
테스트 2 〉    통과 (0.10ms, 30MB)
테스트 3 〉    통과 (0.08ms, 30.1MB)
테스트 4 〉    통과 (0.08ms, 30.1MB)
테스트 5 〉    통과 (0.09ms, 30.1MB)
테스트 6 〉    통과 (0.09ms, 30.2MB)
테스트 7 〉    통과 (0.09ms, 30.1MB)
테스트 8 〉    통과 (0.08ms, 29.9MB)
테스트 9 〉    통과 (0.14ms, 30.2MB)
테스트 10 〉    통과 (0.10ms, 30MB)
테스트 11 〉    통과 (0.09ms, 30.2MB)
테스트 12 〉    통과 (0.08ms, 30.1MB)
테스트 13 〉    통과 (4.53ms, 33.3MB)