[Level 1] 시저 암호
문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
제한 조건
- 공백은 아무리 밀어도 공백입니다.
- s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
- s의 길이는 8000이하입니다.
- n은 1 이상, 25이하인 자연수입니다.
문제 풀이
두 가지의 방법으로 문제를 해결했습니다.
// map 메소드를 이용한 케이스
const solution = (s, n) => {
const characters = [...s];
return characters.map((character) => {
if (character === ' ') return ' ';
let ascii = character.charCodeAt();
let crypt = ascii + n;
// 현재 순회 중인 character가 알파벳 범위 안에 있는지 체크
if ('a'.charCodeAt() <= ascii && ascii <= 'z'.charCodeAt()) {
// 암호화를 했는데 범위를 벗어난 경우 값 보정
if (crypt > 'z'.charCodeAt()) crypt -= 26;
} else if ('A'.charCodeAt() <= ascii && ascii <= 'Z'.charCodeAt()) {
// 암호화를 했는데 범위를 벗어난 경우 값 보정
if (crypt > 'Z'.charCodeAt()) crypt -= 26;
}
return String.fromCharCode(crypt);
}).join('');
};
// 정규 표현식을 이용한 케이스
const solution2 = (s, n) => {
return s.replace(/\w/g, (character) => {
let ascii = character.charCodeAt();
let crypt = ascii + n;
// 현재 순회 중인 character가 알파벳 범위 안에 있는지 체크
if ('a'.charCodeAt() <= ascii && ascii <= 'z'.charCodeAt()) {
// 암호화를 했는데 범위를 벗어난 경우 값 보정
if (crypt > 'z'.charCodeAt()) crypt -= 26;
} else if ('A'.charCodeAt() <= ascii && ascii <= 'Z'.charCodeAt()) {
// 암호화를 했는데 범위를 벗어난 경우 값 보정
if (crypt > 'Z'.charCodeAt()) crypt -= 26;
}
return String.fromCharCode(crypt);
});
};
const inputs = [
['AB', 1],
['z', 1],
['a B z', 4],
];
inputs.forEach((input) => console.log(solution(...input)));
첫 번째 해결 방법은 매개변수로 받은 문자열을 문자 단위의 배열로 만든 후 각각의 요소를 조작하는 방법입니다. 스프레드 연산자(...)를 문자열과 같은 유사 배열 앞에 사용하게 되면, 문자열의 각 문자를 전개하여 배열로 만들어 줍니다. 그렇게 만든 배열을 map 메소드로 순회하면서, 각 문자를 아스키 코드로 변환하고 범위를 체크하면서 결과를 만들어 내면 됩니다. 문자를 아스키 코드로 변환하고, 아스키 코드를 문자로 변환하는 메소드로는 charCodeAt과 fromCharCode가 있습니다.
그리고 두 번째 해결 방법은 처리 방법이 거의 동일하지만, 문자열을 배열로 만들어 순회하는 것이 아닌 문자열의 일부를 교체하는 replace 메소드의 도움을 받았다는 차이가 있습니다. 이 메소드는 첫 번째 인자로 바꾸고자 하는 부분을 지정하고, 두 번째 인자로 어떻게 바꿀 것인지 지정하면 됩니다. /\w/g는 정규 표현식 매칭 패턴이며, 이 패턴은 "문자열에서 임의의 문자(\w) 한 글자를 찾아 처리할 건데, 일치하는 한 부분만 찾고 끝낼 게 아니라, 이후에도 더 있는지 보고(g: global) 걔네들도 똑같이 처리할 거야."라는 의미를 가지고 있습니다. 패턴을 이렇게 했기 때문에 모든 문자를 대상으로 처리할 수 있습니다.
'📝 문제풀이 > 프로그래머스' 카테고리의 다른 글
[Level 1] 수박수박수박수박수박수? (0) | 2022.02.25 |
---|---|
[Level 1] 문자열을 정수로 바꾸기 (0) | 2022.02.25 |
[Level 1] 약수의 합 (0) | 2022.02.25 |
[Level 1] 이상한 문자 만들기 (0) | 2022.02.25 |
[Level 1] 자릿수 더하기 (0) | 2022.02.25 |
댓글
이 글 공유하기
다른 글
-
[Level 1] 수박수박수박수박수박수?
[Level 1] 수박수박수박수박수박수?
2022.02.25 -
[Level 1] 문자열을 정수로 바꾸기
[Level 1] 문자열을 정수로 바꾸기
2022.02.25 -
[Level 1] 약수의 합
[Level 1] 약수의 합
2022.02.25 -
[Level 1] 이상한 문자 만들기
[Level 1] 이상한 문자 만들기
2022.02.25