[Programmers 알고리즘][연습문제] 시저 암호 / [JavaScript] replace
2020. 3. 16. 23:47ㆍAlgorithm
반응형
문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다.
예를 들어 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" |
문제풀이
처음에 풀었던 코드
1. split : 문자열의 문자들을 하나씩 조회하기 위해 분리
2. map : 돌면서 가공
3. join : 나눠진 문자를 다시 합하기
이렇게해서 O(3N) = O(N)이긴하다.
function solution(s, n) {
return s.split('').map(e => {
if (e === ' ') return e;
let ascii = e.charCodeAt();
let upper = (ascii <= 90);
ascii += n;
if (!upper && ascii > 122) ascii = ascii - 122 + 96;
else if (upper && ascii > 90) ascii = ascii - 90 + 64;
return String.fromCharCode(ascii);
}).join('');
}
다른 사람의 풀이 보고 위의 1, 2, 3을 한번에 수행할 수 있는 함수가 replace라는 것을 깨달았다.
1. 정규식사용해서 공백 값 말고 알파벳만 찾기
2. 찾은 문자 배열을 대체해서 저장하기
replace 내부 로직을 보진 못했지만 아마 for문 한번 도는 정도가 아닐까 싶다. O(N)
function solution(s, n) {
return s.replace(/[a-z]/gi, e => {
let ascii = e.charCodeAt();
let upper = (ascii <= 90);
ascii += n;
if (!upper && ascii > 122) ascii = ascii - 122 + 96;
else if (upper && ascii > 90) ascii = ascii - 90 + 64;
return String.fromCharCode(ascii);
});
}
반응형