Programmers/Level 1

[프로그래머스 / JavaScript] - 시저 암호

LaKinRad 2022. 5. 12. 17:48

출처/프로그래머스

● 문제 설명

 

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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) {
    return s.split("").map(
    	arr => arr == " " ? " " : (
        	arr.toUpperCase() == arr ? (
            	arr.charCodeAt() + n > 90 ? String.fromCharCode(arr.charCodeAt() + n - 26
            ) : String.fromCharCode(arr.charCodeAt() + n)
        ) : (
        	arr.charCodeAt() + n > 122 ? String.fromCharCode(arr.charCodeAt() + n - 26
        ) : String.fromCharCode(arr.charCodeAt() + n)))
    ).join("");
}

 

공백과 대문자, 소문자를 판별하고

n만큼 밀었을 때, 'z' 와 'Z' 의 아스키 코드를 넘어가면 26을 빼서 알파벳으로 바꾸고,

넘지 않는다면 그 아스키 코드를 알파벳으로 바꾸어 return 한다.

 


후기

 

코드가 굉장히 더럽다.

 

처음 문제를 봤을 때는 아스키 코드를 사용하면 쉽게 풀겠구나 생각했고, 쉽게 풀었었다.

그렇게 테스트 케이스까지도 쉽게 넘어갔는데, 제출하니 13문제 모두 틀려서 당황했었다.

 

사실 조건이 많아서 다 추가하여 비교하다 보니 코드가 길고 더러워졌는데, 

화살표 함수를 쓰지 않고, 공통된 부분을 합친다면 코드가 줄어들 것 같긴 하다.