찰리의 이야기

Javascript 시저 암호 본문

찰리: 코딩 연습

Javascript 시저 암호

쨜리 2021. 9. 16. 18:14
반응형

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) {
    var answer = '';
    return answer;
}

우선 알파벳의 인덱스를 밀어내기 위해서는

인덱스를 가지는 알파벳 인덱스들을 가져야할 것 같습니다.

그리고 n 만큼 밀어내는 로직과,

대소문자를 판단해서 toLowerCase()나

toUpperCase()를 해주는 로직이 필요할 것 같습니다.

 

function solution(s, n) {
    let alphabet = "abcdefghijklmnopqrstuvwxyz";
    let answer = [];
    function charCase(char, i){
        if(s[i].match(/[A-Z]/g)){
            return char.toUpperCase();
        }else{
            return char.toLowerCase();
        }
    }
    for(let i=0; i<s.length; i++){
        let newIndex = alphabet.indexOf(s[i].toLowerCase()) + n;
        if(s[i] === " "){
            answer.push(" ");
        }else if(newIndex >= 26){
            answer.push(charCase(alphabet[newIndex - 26], i));
        }else{
            answer.push(charCase(alphabet[newIndex], i));
        }
    }
    return answer.join("");
}

 

대소문자를 판단하는 함수 charCase()를 따로 만들었습니다.

match()와 정규표현식을 이용해서

주어진 s가 대문자에 속하는지 소문자에 속하는지 판단해서

char에 해당하는 알파벳을 대소문자화 해주는 방식입니다.

 

여기까지가 제 풀이 방법이고,

다른 풀이법도 살펴보았습니다.

 

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

해당 문자열 s를 split("")으로 배열로 만든 다음,

해당 문자 하나하나를 charCodeAt()을 통해서 아스키코드 넘버로 바꾸어주었다.

아스키코드가 90번까지가 대문자 이기 때문에,

대문자인 경우 반대로 아스키코드를 문자로 변환해주는 fromCharCode()를 사용하면서

알파벳 숫자인 26개를 빼주는 식으로 다시 순환을 돌도록 구성했다.


디테일한 작업이야 비숫했지만,

대소문자 판단을 아스키코드와 charCodeAt()을 사용할 수 있다는걸 알게됐고,

반복문은 가급적 map을 이용하면 훨씬 코드가 간략해질 수 있을 것 같다.

오늘도 많이 배웠다.

 

 

 

 

 

 

Javascript 시저 암호

 

반응형
Comments