Programming/LeetCode

[Dart] 345. Reverse Vowels of a String

Meezzi 2025. 4. 11. 10:27
728x90

1. 문제

https://leetcode.com/problems/reverse-vowels-of-a-string/description/?envType=study-plan-v2&envId=leetcode-75

 

 

 

 

2. 요구사항

1) 주어진 문자열 모음만 뒤집어서 문자열을 반환한다.

2) 모음은 a, e, i, o, u이며, 대소문자 구분 없이 나타난다.

2) 다른 문자는 원래 위치에 그대로 남아 있어야 한다.

 

 

 

3. 핵심 아이디어

1) 투 포인터 사용

 

문자열의 맨 앞과 맨 끝에서부터 두 개의 포인터를 사용하여 각각 모음을 찾는다.

왼쪽 포인터는 모음을 찾을 때까지 오른쪽으로 이동하고, 

오른쪽 포인터는 모음을 찾을 때까지 왼쪽으로 이동한다.

 

두 포인터가 모음을 찾으면 두 포인터끼리 문자를 서로 교환한다.

교환 후에는 포인터를 각각 한 칸씩 이동하여 다음 모음을 찾아간다.

 

모음들이 모두 교환되면, 리스트를 다시 문자열로 변환하여 결과를 반환한다.

 

 

2) 코드

class Solution {
  // reverseVowels 함수는 문자열에서 모음만 뒤집어서 리턴함
  String reverseVowels(String s) {
    // 문자열을 리스트로 변환 (문자 하나씩 분리)
    List<String> strList = s.split('');

    // 모음 리스트 (대소문자 모두 포함)
    List<String> vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'];

    // 투 포인터 초기화
    int start = 0;
    int end = s.length - 1;

    // start가 end보다 작을 동안 반복
    while (start < end) {

      // start 포인터가 가리키는 문자가 모음이 아닐 경우 오른쪽으로 이동
      while (start < end && !vowels.contains(strList[start])) {
        start++;
      }

      // end 포인터가 가리키는 문자가 모음이 아닐 경우 왼쪽으로 이동
      while (start < end && !vowels.contains(strList[end])) {
        end--;
      }

      // start와 end 모두 모음을 가리키면 swap
      if (start < end) {
        String tmp = strList[start];
        strList[start] = strList[end];
        strList[end] = tmp;

        // 포인터 이동
        start++;
        end--;
      }
    }

    // 리스트를 문자열로 다시 변환해서 반환
    return strList.join('');
  }
}
728x90