728x90
[프로그래머스] 시저 암호 | javascript level 1
문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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(v => {
if(v === ' ') return v;
return v.toUpperCase().charCodeAt()+n > 90 ? String.fromCharCode(v.charCodeAt()+n-26) : String.fromCharCode(v.charCodeAt()+n)
}).join('');
}
map
요소를 이용해 새로운 배열을 생성하고 원본 배열과 똑같은 길이의 배열을 생성합니다.
charCodeAt()
해당하는 문자의 아스키코드 값(숫자)를 반환합니다.
fromCharCode()
해당하는 아스키코드 값(숫자)의 문자를 반환합니다.
설명: split 으로 문자열을 나누었을때 띄어쓰기가 포함되어 있으므로 띄어쓰기가 있으면 그대로 return 합니다.
그게 아니라 문자라면 두번째 줄로 넘어가는데 해당 문자를 대문자로 바꿔서 문자를 아스키코드로 변환하고 n을 더했을때 90(아스키코드에서 Z에 해당) 초과라면 값을 나타낼 수 없습니다. 그 예외를 걸러주기 위해 사용된 코드입니다.
예를 들어서 s가 Z(90)이고 n이 1이라고 가정하면 91입니다. A(65)를 출력해야하는데 예외처리 없이 계산하면 91은 '[' 입니다. 원하는 답이 아니죠? 아스키코드가 a-z 안에서 계속 돌아야하기 때문에 사용된 예외처리입니다.
그래서 만약 90을 초과한다면 해당 값에서 26(알파벳 갯수)을 빼주고 그게 아니라면 n을 더한 그 값만 return 해주면 됩니다.
아스키코드 https://asciichart.com/
다른 분의 코드
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;
}
아스키코드를 사용하지 않고 답을 도출해낸 코드입니다.
728x90
'ALGORITHM > PROGRAMMERS' 카테고리의 다른 글
[프로그래머스] 행렬의 덧셈 | javascript (0) | 2021.07.30 |
---|---|
[프로그래머스] 콜라츠 추측 | javascript (0) | 2021.07.29 |
[프로그래머스] 정수 제곱근 판별 | javascript (0) | 2021.07.27 |
[프로그래머스] 직사각형 별찍기 | javascript (0) | 2021.07.26 |
[프로그래머스] x만큼 간격이 있는 n개의 숫자 | javascript (0) | 2021.07.25 |