📌 문제 링크 :
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 |
댓글