문제 정의
문자열을 하나 인자로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 오직 모음(a, e, i, o, u)으로만 이루어진 가장 긴 연속 부분 문자열(substring)의 길이를 반환해야 합니다.
예를 들어 입력 문자열이 'schooeal'이라면, 중간에 있는 'ooea'가 연속된 모음 4개로 이루어져 있으므로 결과는 4가 됩니다.
접근 방법
가장 효율적인 해결 방법은 문자열을 한 번만 순회하는 선형 탐색(O(n))입니다. 다음 두 개의 변수를 활용합니다.
cur: 현재 위치까지 이어지는 연속 모음의 개수max: 지금까지 발견한 최대 연속 모음 길이
각 문자를 확인하면서 모음이면 cur을 1 증가시키고, max보다 커지면 갱신합니다. 모음이 아닌 문자를 만나면 cur을 0으로 초기화하여 새로운 카운트를 시작합니다.
예제 코드
const str = 'schooeal';
const findLongestVowel = (str = '') => {
let cur = 0;
let max = 0;
for (let i = 0; i < str.length; ++i) {
if ("aeiou".includes(str[i])) {
cur++;
if (cur > max) {
max = cur;
}
} else {
cur = 0;
}
}
return max;
};
console.log(findLongestVowel(str));
실행 결과
4
코드 동작 원리
입력 문자열 'schooeal'을 기준으로 살펴보겠습니다.
s,c,h는 모음이 아니므로cur은 계속 0으로 유지됩니다.o,o,e,a는 연속된 모음이므로cur이 1 → 2 → 3 → 4로 증가하고,max도 함께 4로 갱신됩니다.- 마지막
l은 자음이므로cur이 0으로 초기화되지만, 이미 기록된max = 4는 그대로 유지됩니다.
따라서 함수는 최종적으로 4를 반환합니다.
정리
이 알고리즘은 문자열의 길이를 n이라 할 때 시간 복잡도 O(n), 공간 복잡도 O(1)로 매우 효율적입니다. 문자열을 한 번만 순회하면서 연속 조건을 만족하는 구간의 길이를 추적하는 패턴은 슬라이딩 윈도우나 카운터 기반 문제에서 널리 활용되는 기법이므로, 익혀두면 다양한 코딩 테스트 문제에 응용할 수 있습니다.