문자열을 입력받아 그 안의 알파벳을 거울처럼 뒤집는(미러링하는) 함수를 만들어 보겠습니다. 동작 방식은 다음과 같습니다.
입력값이 'abcd'라면
출력값은 'zyxw'가 되어야 합니다.
이 함수의 핵심 원리는 간단합니다. 각 문자를 자신으로부터 (26 - N)번째 떨어진 알파벳으로 매핑하는 것입니다. 여기서 N은 해당 알파벳의 1부터 시작하는 인덱스를 의미합니다. 예를 들어 e는 5번째, j는 10번째 알파벳입니다.
구현에는 String.prototype.replace() 메서드를 활용합니다. 정규표현식을 함께 사용하면 대소문자 구분 없이 모든 영어 알파벳을 한 번에 처리할 수 있습니다. 완성된 코드는 다음과 같습니다.
예제 코드
const str = 'ABCD';
const mirrorString = str => {
const regex = /[A-Za-z]/g;
return str.replace(regex, char => {
const ascii = char.charCodeAt();
let start, end;
if(ascii > 96){
start = 97;
end = 122;
} else {
start = 65;
end = 90;
}
return String.fromCharCode(end - (ascii-start));
});
}
console.log(mirrorString(str));
console.log(mirrorString('Can we flip this as well'));
console.log(mirrorString('SOME UPPERCASE STUFF'));
코드 동작 원리
코드의 핵심 로직을 단계별로 살펴보겠습니다.
1. 정규표현식 매칭: /[A-Za-z]/g 패턴은 대소문자와 관계없이 문자열 내의 모든 영어 알파벳을 찾아냅니다.
2. ASCII 코드 판별: charCodeAt() 메서드로 각 문자의 ASCII 값을 구한 후, 소문자(a~z: 97~122)인지 대문자(A~Z: 65~90)인지 구분합니다.
3. 미러링 계산: end - (ascii - start) 공식을 통해 각 문자를 알파벳 순서에서 정반대 위치의 문자로 변환합니다. 예를 들어 첫 번째 알파벳 'A'는 마지막 알파벳 'Z'로, 'B'는 'Y'로 바뀌는 식입니다.
4. 문자 변환: String.fromCharCode()로 계산된 ASCII 값을 다시 문자로 변환하여 반환합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
ZYXW
Xzm dv uork gsrh zh dvoo
HLNV FKKVIXZHV HGFUU
결과에서 확인할 수 있듯이, 대소문자가 섞여 있거나 공백이 포함된 문장이라도 알파벳만 정확하게 미러링되며 나머지 문자는 그대로 유지됩니다.