문제 정의
영어 알파벳으로 이루어진 문자열 str을 첫 번째이자 유일한 인수로 받는 자바스크립트 함수를 작성해야 합니다. 이 함수는 문자열 안에서 모음과 자음이 번갈아 가며 나타날 때에만 true를 반환하고, 그렇지 않은 경우에는 false를 반환해야 합니다.
예를 들어 함수의 입력이 다음과 같다면,
입력
const str = 'amazon';
출력
const output = true;
출력 설명
'amazon' 문자열에서는 모음(a, o)과 자음(m, z, n)이 서로 번갈아 나타나기 때문에 결과가 true입니다.
코드 구현
다음은 위 문제를 해결하는 전체 코드입니다.
const str = 'amazon';
const appearAlternatingly = (str = '') => {
return str.split('').every((v, i) => {
if (/[aeiou]/.test(str[0])) {
// 첫 글자가 모음인 경우: 짝수 인덱스는 모음, 홀수 인덱스는 자음
if (i % 2 === 0 && /[aeiou]/.test(v)) {
return true;
} else if (i % 2 !== 0 && !/[aeiou]/.test(v)) {
return true;
} else {
return false;
}
}
if (!/[aeiou]/.test(str[0])) {
// 첫 글자가 자음인 경우: 짝수 인덱스는 자음, 홀수 인덱스는 모음
if (i % 2 === 0 && !/[aeiou]/.test(v)) {
return true;
} else if (i % 2 !== 0 && /[aeiou]/.test(v)) {
return true;
} else {
return false;
}
}
});
};
console.log(appearAlternatingly(str));
출력 결과
true
코드 동작 원리
이 코드의 핵심 로직은 다음과 같습니다.
- 먼저 정규 표현식
/[aeiou]/으로 문자열의 첫 글자가 모음인지 판별합니다. - 첫 글자가 모음이라면 짝수 번째(인덱스 0, 2, 4…) 위치에는 반드시 모음이, 홀수 번째 위치에는 반드시 자음이 와야 합니다.
- 첫 글자가 자음이라면 그 반대로, 짝수 번째에는 자음이, 홀수 번째에는 모음이 와야 합니다.
Array.prototype.every()메서드로 모든 문자가 규칙을 만족하는지 검사하며, 하나라도 어긋나면 즉시false를 반환합니다.
참고: 대소문자를 함께 처리하려면 정규 표현식에i플래그를 붙여/[aeiou]/i형태로 사용하면 됩니다.
더 간결한 리팩토링 버전
위 코드는 조건 분기가 많아 다소 장황합니다. 첫 글자의 모음 여부를 변수에 저장해 두면 아래와 같이 훨씬 간결하게 작성할 수 있습니다.
const appearAlternatingly = (str = '') => {
const startsWithVowel = /[aeiou]/.test(str[0]);
return [...str].every((ch, i) =>
/[aeiou]/.test(ch) === (startsWithVowel ? i % 2 === 0 : i % 2 !== 0)
);
};
console.log(appearAlternatingly('amazon')); // true
console.log(appearAlternatingly('apple')); // false
이 버전은 각 문자가 모음인지 여부와 해당 인덱스에서 기대되는 문자 종류를 한 번의 비교로 판단하므로, 가독성과 유지보수성이 크게 향상됩니다.