[Programmers] 시저 암호
2022. 10. 20. 20:33ㆍ기록/Programmers
- 목차
문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다.
예를 들어 "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) {
let answer = "";
answer = s.split('').map((char) => {
let num = char.charCodeAt();
if (num === 32) {
return ' ';
} else if (num <= 90 && num + n > 90 || num <= 122 && num + n > 122) {
return String.fromCharCode(num + n - 26);
} else {
return String.fromCharCode(num + n);
}
});
return answer.join('');
}
- 문자열을 한 문자씩 잘라서 요소로 넣은 배열을 만든다.
- 배열의 요소를 하나씩 꺼내고 map() 안에서 리턴한 값으로 해당 요소의 값을 변경한다.
- 현재 요소의 아스키코드를 구한다.
- 아스키 코드가 32 일 경우 공백이기 때문에 공백 문자를 리턴한다.
- 아스키 코드가 90 이상이면서 아스키코드에 거리를 더한 값이 90보다 클 경우
- 대문자 Z 다음은 A 이기 때문에 아스키코드에 거리를 더한 값에서 26을 빼주어 대문자를 순환하게 한다.
- A : 65 / Z : 90
- 90(Z) + 1(거리) - 26 = 65(A)
- 아스키 코드가 122 이하이면서 아스키코드에 거리를 더한 값이 122보다 클 경우
- 소문자 z 다음은 a 이기 때문에 아스키코드에 거리를 더한 값에서 26을 빼주어 소문자를 순환하게 한다.
- a : 97 / z : 122
- 122(z) + 1(거리) - 26 = 97(a)
- 조건에 해당하지 않는 경우 주어진 거리만큼 밀어도 상관없기 때문에 아스키 코드에 거리를 더해서 리턴한다.
- 값이 변경된 배열의 요소들을 이어붙여 문자열로 만들어 리턴한다.
다른 사람의 문제 풀이
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;
}
- 미리 모든 영문 대소문자 문자열을 할당한 변수를 각각 정의한다.
- 주어진 문자열의 길이만큼 for문을 반복한다.
- 현재 문자가 공백일 경우 정답 변수에 공백을 넣어주고 다시 for문 최상단으로 올라가서 실행한다.
- 현재 문자가 대문자 문자열에 포함되어 있을 경우 대문자 문자열을 textArr 변수에 할당한다.
- 현재 문자가 소문자 문자열에 포함되어 있을 경우 소문자 문자열을 textArr 변수에 할당한다.
- textArr 문자열에서 현재 문자의 인덱스에 주어진 거리를 더해 인덱스 변수에 할당한다.
- 인덱스가 textArr 문자열의 길이보다 크거나 같을 경우
- 인덱스에서 textArr 문자열의 길이를 뺀다. (대/소문자 맨 앞으로 돌아가기)
- textArr 에서 인덱스로 문자를 찾아 정답 변수에 더해준다.
- 완성된 문자열을 반환한다.