IT/Algorithm

프로그래머스) 시저 암호

프티 2021. 10. 27. 12:42
반응형

https://programmers.co.kr/learn/courses/30/lessons/12926

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀

programmers.co.kr

나의 풀이

function solution(s, n) {
    const upperList = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    const lowerList = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
    
    return s.split("")
        .map(char => {
        if (char === " ") {
            return " "
        } else if (char === char.toUpperCase()) {
            if ((upperList.indexOf(char) + n) > upperList.length - 1) {
                return upperList[upperList.indexOf(char) + n - upperList.length];
            }

            return upperList[upperList.indexOf(char) + n];
        }

        if ((lowerList.indexOf(char) + n) > lowerList.length - 1) {
            return lowerList[lowerList.indexOf(char) + n - lowerList.length];
        }
        
        return lowerList[lowerList.indexOf(char) + n];
    })
        .join("");
}

대문자와 소문자 알파벳 리스트를 만들었다.

 

s를 split 하여 배열로 만들고, map으로 대소문자, 공백에 따라 변환을 수행하도록 하였다.

마지막에 join하여 문자열로 반환하였다.

 

그런데 아스키 코드를 사용하면 코드를 더 간결하게 작성할 수 있다.

아스키코드

여기서 대문자 알파벳은 16진수 기준으로 65 ~ 90까지이고, 소문자는 97 ~ 122까지이다.

 

이를 활용하여 코드를 작성해보았다.

function solution(s, n) {
    return s.split("")
        .map(char => {
        if (char === " ") {
            return " "
        }
        
        return String.fromCharCode(char.charCodeAt(0) > 90 ? (char.charCodeAt(0) + n - 97) % 26 + 97 : (char.charCodeAt(0) + n - 65) % 26 + 65);
    })
        .join("");
}

절반 가까이 코드를 줄일 수 있었다!

반응형