Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 모음과 자음이 번갈아 나오는지 검사하는 방법


문제 정의

영어 알파벳으로 이루어진 문자열 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

이 버전은 각 문자가 모음인지 여부와 해당 인덱스에서 기대되는 문자 종류를 한 번의 비교로 판단하므로, 가독성과 유지보수성이 크게 향상됩니다.