Level 1) 시저 암호⭐️

Doozuu·2023년 2월 11일
0

프로그래머스 (JS)

목록 보기
46/183

문제 설명

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

풀이

우선 문자열을 배열에 쪼개 담고 map으로 하나씩 변환하려고 한다.

(문자를 밀기 위해) 문자를 아스키 코드로 변환해서 주어진 숫자(n)를 더해주면 크게 두 가지 케이스로 분류할 수 있다.

case 1 : 알파벳 범위를 벗어나는 경우

문자를 아스키 코드로 바꾸어서 n을 더해주었을 때, 알파벳 범위를 넘어가면 이상한 기호들이 출력된다. 따라서 알파벳 범위를 벗어날 때는 다시 a/A부터 시작하도록 해주어야 한다.

이때, 대/소문자에 따라 아스키코드가 다르므로 구별하여 체크해준다.
(z의 아스키코드는 122, Z의 아스키코드는 90이다.)

  • 소문자이고, n을 더했을 때 z(122)보다 크다.
  • 대문자이고, n을 더했을 때 Z(90)보다 크다.

위와 같이 알파벳 범위를 벗어나는 경우에는 n을 더한 값에서 26을 빼서 문자로 바꾸어 준다.
(알파벳 갯수가 25개이기 때문.)

case 2 : 알파벳 범위를 벗어나지 않는 경우

n을 더해도 알파벳 범위를 벗어나지 않으면 그냥 n을 더해주면 된다.

이때 유의해야 할 점은 공백이다.
공백에 n을 더해주면 공백이 유지되지 않고 다른 기호로 바뀌기 때문에 공백 부분에는 n을 더해주면 안된다.

따라서 아래처럼 분류해주면 된다.

  • 공백이면 n을 더하지 않고 공백으로 두기
  • 공백이 아니면 n을 더해서 문자로 바꾸기

참고 ) 아스키 코드표

function solution(s, n) {
  return s.split("")
        .map((val) =>
           val.match(/^[a-z]/g) && val.charCodeAt() + n > 122 || val.match(/^[A-Z]/g) && val.charCodeAt() + n > 90
            ? String.fromCharCode(val.charCodeAt() + n - 26)
            : val.match(/\s/g) ? ' ' : String.fromCharCode(val.charCodeAt() + n)
        )
        .join("");
}

공백 포함 체크 : string.match(/\s/g)

문자를 아스키코드로 바꾸기: string.charCodeAt(index)

아스키코드를 문자로 바꾸기 : String.fromCharCode(아스키코드)


아스키 코드와 정규 표현식 없이 푸는 방법

대소문자 알파벳을 직접 써서 위치를 찾아주는 방법도 있다.

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;
}
profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글