*시저 암호(카이사르 암호)란 암호화하고자 하는 내용을 알파벳별로 일정한 거리만큼 밀어서 다른 알파벳으로 치환하는 암호화 방식이다.

 

#나의 풀이

function solution(s, n) {
    let answer = '';
    for (let i = 0; i < s.length; i++){
        if(s[i] === " "){
            answer += " ";
        }
        else{
            let ascii = s.charCodeAt(i);
            let moveNum = ascii + n;
            if(ascii >= 65 && ascii <= 90){
                moveNum > 90 ? answer += String.fromCharCode(moveNum - 26) : answer += String.fromCharCode(moveNum)
            }
            else{
                moveNum > 122 ? answer += String.fromCharCode(moveNum - 26) : answer += String.fromCharCode(moveNum)
            }  
        }
    }
    return answer;
}

*위의 코드를 내용은 같지만 조금 간결하게 만들어 보았다.

function solution(s, n) {
    let answer = '';
    for (let i = 0; i < s.length; i++){
        if(s[i] === " "){
            answer += " ";
            continue;
        }
        let ascii = s.charCodeAt(i);
        let moveNum = ascii + n;
        ascii > 90 ? answer += String.fromCharCode((moveNum - 97) % 26 + 97) : answer += String.fromCharCode((moveNum - 65) % 26 + 65)
    }
    return answer;
}

 

2021/01/11 - [개발/Javascript] - charCodeAt, fromCharCode

 

charCodeAt, fromCharCode

아스키코드(ASCIICODE)란? ==> ASCII 코드란 'American Standard Code for Information Interchange'의 약자이며, 아스키코드라고 읽는다. 아스키코드는 문자에 대해 각각의 번호를 지정하여 관리하고..

jwookj.tistory.com

#다른 방법1(아스키 코드를 활용하지 않고)

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

 

#다른 방법2(이렇게 코드를 짜는 날이 올까)

function caesar(s, n) {
    var result = s.replace(/[a-z]/ig, c => [ c = c.charCodeAt(0), String.fromCharCode((c & 96) + (c % 32 + n - 1) % 26 + 1) ][1]);

    return result;
}

프로그래머스에서 누군가 댓글로 적은 코드의 설명을 보며 이해했다. 

 

2진법으로 대문자의 코드들은 1000001~1011010, 소문자는 1100001~1111010라서 앞에 2자리를 빼고는 같습니다.  

즉, 앞의 2자리로 대소문자를, 나머지 5자리로 알파벳을 구분합니다.  따라서 '(c & 96(1100000))'으로 앞의 2자리만 가져와 먼저 대소문자 구분부를 빼놓습니다.

뒤에 남은 5자리의 수(00001~11010)를 가져오기 위해 'c % 32(100000)'를 합니다.  a가 1부터 시작하니 나머지 계산을 위해 '- 1'을 해서 초기점을 0으로(00000~11001) 잡아줍니다. 그럼 0~25의 숫자 중 하나가 나오고 여기서 n만큼 더해준 뒤 26으로 나머지 계산을 하고, 

다시 아까 빼 준 1을 다시 더한 것입니다.

 

'코딩테스트 > Javascript' 카테고리의 다른 글

이상한 문자 만들기  (0) 2021.01.18
약수의 합  (0) 2021.01.13
문자열을 정수로 바꾸기  (0) 2021.01.11
수박수박수박수박수박수?  (0) 2021.01.11
서울에서 김서방 찾기  (0) 2021.01.09

+ Recent posts