본문 바로가기
알고리즘 스터디/프로그래머스 스킬체크 레벨 1(끝)

[프로그래머스 스킬체크 레벨 1] 시저 암호 풀이 및 설명 - 자바스크립트[JavaScript]

by 레일라오리덕 2021. 7. 18.
728x90

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

 

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

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

programmers.co.kr

 

문제

 

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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;
}

 

풀이 [JavaScript]

 

우선 들어온 문자를 split함수를 사용하여 쪼갠 값을 배열에 넣어주고 아스키코드 값을 비교하여 대소문자를 구분해주었습니다.

대소문자를 구분한 후, 입력받은 값에서 n값을 추가했을 때, z나 Z의 값보다 큰 경우에는 문자 + n 값에서 26을 빼주어서 다시 A나 a에서부터의 추가된 값을 더해주어 원하는 결과값이 나오게 로직을 구현해보았습니다.

하지만, 아래의 코드는 정석대로 풀었지만 코드의 반복이 있습니다.

function solution(s, n) {
    var splited = s.split('');
    var answer = '';
    for(var i in splited){
        if(splited[i] !== ' '){
            if(splited[i].charCodeAt(0) >= 97){ //lowerCase
                if(splited[i].charCodeAt(0)+ n > 122){
                    answer += String.fromCharCode(splited[i].charCodeAt(0)+ n -26);
                }else{
                    answer += String.fromCharCode(splited[i].charCodeAt(0)+ n);
                }
            }else{ //uppercase
                if(splited[i].charCodeAt(0)+ n > 90){
                    answer += String.fromCharCode(splited[i].charCodeAt(0)+ n -26);
                }else{
                    answer += String.fromCharCode(splited[i].charCodeAt(0)+ n);
                }
            }
        }else{
            answer += ' ';
        }
    }
    return answer;
}
728x90

 

 

아래는 원리는 같지만 반복되는 코드를 제거하고 26으로 나눈 나머지 값이 a와 A로 값에서부터의 차이가 된다는 것을 착안하여 수정한 코드입니다.

function solution(s, n) {
    var splited = s.split('');
    var answer = '';
    for(var i in splited){
        var char =  splited[i].charCodeAt(0);
        if(splited[i] !== ' '){
            if(char>=97 && char <= 122){//lowercase
                answer += String.fromCharCode((char + n -97)%26 + 97);
            }else{//uppercase
                answer += String.fromCharCode((char + n -65)%26 + 65);
            }
        }else{
            answer += ' ';
        }
    }
    return answer;
}

 

채점 결과 [JavaScript]

 

728x90

댓글