본문 바로가기

프로그래머스/JavaScript

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

- 문자열 s와 거리 n이 주어집니다.

- 공백은 그대로 공백 입니다.

- s는 알파벳 소문자, 대문자, 공백입니다.

- n은 1 이상, 25이하인 자연수입니다.

 

 

공백을 제외한 문자들을 변경

function solution(s, n) {
	s.replace(/[a-z]/gi/, function() {})
}

변경 될 문자는 원래 문자를 n이라는 숫자만큼 뒤에 위치한 문자 ('z'는 1만큼 밀면 'a')

문자의 코드를 charCodeAt()으로 확인

function solution(s, n) {
    s.replace(/[a-z]/ig, function(c) {
        var code = c.charCodeAt()
        var newCode = 0;
        newCode = code > 64 && code < 91 ? ((code + n - 39) % 26) + 65 : ((code + n - 71) % 26) + 97;
        return c = String.fromCharCode(newCode);
    });
}

제가 계산한 방법은 대문자 A를 기준으로 설명하면

1. 65를 26만 남도록 39라는 숫자를 빼줍니다.  65 - 39 

2. 이 숫자를 26으로 나눴을 때 나머지가 0이면 A 1이면 B 2이면 C가 됩니다.  ( 65 - 39 ) % 26 

3. n만큼 뒤에 있는 문자를 구해야하기 때문에 +n을 더했을 때의 나머지를 구해줍니다.  ( 65 - 39 + n ) % 26 

4. String.fromCharCode() 메서드를 사용해 원하는 알파벳을 구하려면 코드가 0부터가 아닌 65부터 시작해야 하므로 65라는 숫자는 더해줍니다.  ( ( 65 - 39 + n ) % 26 ) + 65 

 

소문자의 계산 방법도 동일합니다. 

71을 이라는 숫자는 위의 설명 1번과 동일하게 26만 남도록 빼준 숫자 입니다.  97 - 71 = 26 

 

최종 코드

function solution(s, n) {
    var answer = '';
    
    answer = s.replace(/[a-z]/ig, function(c) {
        var code = c.charCodeAt()
        var newCode = 0;
        newCode = code > 64 && code < 91 ? ((code + n - 39) % 26) + 65 : ((code + n - 71) % 26) + 97;
        return c = String.fromCharCode(newCode);
    });
    
    return answer;
}