관리 메뉴

bright jazz music

345. Reverse Vowels of a String 본문

LeetCode

345. Reverse Vowels of a String

bright jazz music 2026. 1. 14. 22:41
function reverseVowels(s:string): string {
    // const vowels = ['a','e','i','o','u','A','E','I','O','U'];
    const vowels = new Set(['a','e','i','o','u','A','E','I','O','U']);

    let arr = s.split('');
    let left = 0;
    let right = arr.length -1;

    while( left < right) {
        // while(left < right && !vowels.includes(arr[left])){
        while(left < right && !vowels.has(arr[left])){            
            left++;
        }
        // while(left < right && !vowels.includes(arr[right])){
        while(left < right && !vowels.has(arr[right])){
            right--;
        }

        [arr[left], arr[right]] = [arr[right], arr[left]];
        left++;
        right--;
    }
    return arr.join('');    
}



// function reverseVowels(s: string): string {
//     const vowels = ['a','e','i','o','u','A','E','I','O','U'];
//     let map = new Map();

//     // 속하면 일단 보관한다
//     // 순서와 값을 추가하면 되겠지
//     // ㄴㄴ

//     for (let i = 0; i < s.length; i++) {
//         if(vowels.includes(s[i])) {
//             map.set(i, s[i])
//         }
//     }
// console.log(map)
//     return s;
    
// };

 

투 포인터로 푸는 게 나은 문제였다. 나는 원래 아래와 같이 풀려고 했다.

 

 

function reverseVowels(s: string): string {
    const vowels = ['a','e','i','o','u','A','E','I','O','U'];
    let map = new Map();
    
    // 모음 위치와 값 저장
    for (let i = 0; i < s.length; i++) {
        if(vowels.includes(s[i])) {
            map.set(i, s[i])
        }
    }
    
    // Map의 값들을 배열로 추출해서 뒤집기
    const reversedVowels = Array.from(map.values()).reverse();
    
    // 문자열을 배열로 변환
    const arr = s.split('');
    let vowelIndex = 0;
    
    // 모음 위치에 reversed 값 넣기
    for (let i = 0; i < arr.length; i++) {
        if(vowels.includes(arr[i])) {
            arr[i] = reversedVowels[vowelIndex++];
        }
    }
    
    return arr.join('');
}

 

 

AI는 이런 사고를 했다고 한다.

1. 문제 핵심 파악

"reverse vowels" → 모음들끼리만 순서를 뒤집어야 함
자음 위치는 그대로 유지

2. "뒤집는다"는 키워드에서 떠오르는 것

배열 reverse: 양 끝에서 시작해서 중간으로 모이기
"앞에서 첫 번째 모음"과 "뒤에서 첫 번째 모음"을 swap하면 되겠다!

3. Two Pointer 패턴 인식
hello
^   ^  양쪽에서 출발
 e   o  모음 찾으면 swap
이 패턴은 "양 끝에서 조건 만족하는 것 찾아서 처리"할 때 자주 씁니다:

Palindrome 체크
Container with most water
정렬된 배열에서 두 수의 합 찾기

4. 왜 Map보다 나은가 깨달음

Map: 전체 순회 → 저장 → 뒤집기 → 다시 순회 (2번 순회)
Two Pointer: 한 번 순회하면서 바로 swap (1번 순회)

경험상 깨달은 팁:

"reverse", "opposite ends", "from both sides" 같은 키워드 보이면 → Two Pointer 의심
공간복잡도 줄이고 싶으면 → in-place 수정 방법 고민
이미 순서/위치 정보가 중요하면 → 포인터로 위치 추적

'LeetCode' 카테고리의 다른 글

334. Increasing Triplet Subsequence  (0) 2026.01.17
238. Product of Array Except Self  (0) 2026.01.16
151. Reverse Words in a String  (0) 2026.01.15
605. Can place flowers  (0) 2026.01.13
Comments