알고리즘 문제 풀이: 자바/LeetCode

345. Reverse Vowels of a String

hueco 2025. 11. 4.

 

📌 문제 링크 :

https://leetcode.com/problems/reverse-vowels-of-a-string

 

내 풀이(Success) :

class Solution {
    private static final Set<Character> VOWELS = Set.of('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U');

    private static boolean isVowel(char ch) {
        return VOWELS.contains(ch);
    }

    public String reverseVowels(String s) {
        StringBuilder sb = new StringBuilder(s);
        boolean[] isVisited = new boolean[s.length()];
        int rt = sb.length() - 1;

        for (int lt = 0; lt < sb.length(); lt++) {
            if (isVowel(sb.charAt(lt))) {
                while(rt >= 0) {
                    if (isVowel(sb.charAt(rt))) {
                        if (!isVisited[lt] && !isVisited[rt]) {
                            char temp = sb.charAt(lt);
                            sb.setCharAt(lt, sb.charAt(rt));
                            sb.setCharAt(rt, temp);
                            isVisited[rt--] = true;
                            break;
                        }
                    }
                    isVisited[rt--] = true;
                }
            }
            isVisited[lt] = true;
        }
        return sb.toString();
    }
}

 

🧐 리뷰 :

 문자열의 앞과 뒤에서 포인터를 움직이면서 모음 여부를 판별하고, 모음이면 포인터 변수가 가리키는 문자를 서로 교환해주면 해결할 수 있는 문제이다. 이 문제를 for 반복문을 사용해서 풀이하려고 접근하지 않았다면, 방문 여부를 체크할 변수(isVisited)를 선언하지 않아도 충분히 풀 수 있을 것 같다라는 생각이 들었다. 또한 문자열 관련 문제를 풀때는 반사적으로 StringBuilder를 떠올리는데, 이 부분을 char[]을 이용하여 풀이할 수 있는 문제인지 생각해보는 연습이 필요할 것 같다.

 

🏷️ 참고 자료 :

자바로 풀이한 코드 중에서 가장 많은 좋아요를 받은 풀이

class Solution {
    public String reverseVowels(String s) {
        char[] word = s.toCharArray();
        int start = 0;
        int end = s.length() - 1;
        String vowels = "aeiouAEIOU";
        
        while (start < end) {
            // Move start pointer until it points to a vowel
            while (start < end && vowels.indexOf(word[start]) == -1) {
                start++;
            }
            
            // Move end pointer until it points to a vowel
            while (start < end && vowels.indexOf(word[end]) == -1) {
                end--;
            }
            
            // Swap the vowels
            char temp = word[start];
            word[start] = word[end];
            word[end] = temp;
            
            // Move the pointers towards each other
            start++;
            end--;
        }
        
        String answer = new String(word);
        return answer;
    }
}

 

 

'알고리즘 문제 풀이: 자바 > LeetCode' 카테고리의 다른 글

238. Product of Array Except Self  (0) 2025.11.06
605. Can Place Flowers  (0) 2025.11.05
151. Reverse Words in a String  (0) 2025.11.03
1207. Unique Number of Occurrences  (0) 2025.11.02
1732. Find the Highest Altitude  (0) 2025.11.01

댓글