문자열을 유일한 입력값으로 받아 새로운 문자열을 반환하는 JavaScript 함수를 작성해야 합니다. 이 함수는 입력 문자열을 기반으로 다음 두 가지 규칙을 적용한 결과를 만들어야 합니다.
- 모든 모음(a, e, i, o, u)은 대문자로 변환합니다.
- 나머지 알파벳 소문자는 각각 알파벳 순서상 다음 문자로 바꾸며, z는 a로 순환시킵니다.
예를 들어 입력 문자열이 다음과 같다면,
const str = 'newString';
출력 결과는 아래와 같아야 합니다.
const output = 'oExSusIoh';
입력 문자열 'newString'에서 n은 o로, e는 대문자 E로, w는 x로 변환되는 방식입니다. 이미 대문자였던 S는 그대로 유지되는 점도 확인할 수 있습니다.
구현 코드
const str = 'newString';
const capitalizeAndMove = (str = '') => {
let s = '';
s = str.replace(/[a-z]/g, function(c) {
return 'aeiou'.indexOf(c) > -1
? c.toUpperCase()
: String.fromCharCode(Math.max(c.charCodeAt(0) % 122 + 1, 97));
});
return s;
};
console.log(capitalizeAndMove(str));
코드 동작 원리
- /[a-z]/g 정규 표현식: 문자열 내의 모든 영어 소문자를 찾아냅니다. g(global) 플래그 덕분에 일치하는 모든 문자가 한 번에 처리됩니다.
- 모음 여부 판별: replace 콜백 함수 안에서 'aeiou'.indexOf(c)의 값이 -1보다 크면 해당 문자가 모음이라는 의미이므로, toUpperCase()로 대문자를 반환합니다.
- 다음 문자 계산: 자음인 경우에는 charCodeAt(0)으로 문자 코드를 구한 뒤, 122(즉 'z')로 나눈 나머지에 1을 더해 다음 문자의 코드를 얻습니다.
- z → a 순환 처리: 'z'(코드 122)는 122 % 122 = 0이 되기 때문에, Math.max(..., 97)가 이 값을 97(즉 'a')로 보정하여 알파벳이 처음으로 순환되도록 합니다.
- 대문자 및 기타 문자 유지: 정규 표현식이 소문자 범위만 검사하므로, 이미 대문자인 알파벳(S 등)은 물론 숫자, 공백, 특수 문자도 변환 없이 그대로 남게 됩니다.
실행 결과
코드를 실행하면 콘솔에 다음과 같이 출력됩니다.
oExSusIoh