LeetCode 345. Reverse Vowels of a String
🗓️ Daily LeetCoding Challenge November, Day 4
String / Two Pointers
https://leetcode.com/problems/reverse-vowels-of-a-string/
Reverse Vowels of a String - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
1. 문제 설명
문자열 s가 주어지고, s의 모음만 순서를 뒤집은 후 리턴하는 문제이다.
이때, s에 대소문자가 모두 포함될 수 있다.
아래와 같이 s가 주어진다고 가정하자.
s = "leetcode"
s[1]과 s[7]을 스왑하고, s[2]와 s[5]를 스왑하면 된다.
따라서 s = "leotcede"를 리턴해야 한다.
2. 문제 접근
Two Pointers
맨 처음과 마지막의 문자를 포인팅하여 두 값이 모두 모음이면 스왑한다.
만약 둘 중 한 값이라도 자음이면 자음을 가리키는 포인터를 모음과 만날 때까지 계속 증가시키거나 감소시킨다.
이때, str 자료형은 스왑할 수 없으므로 list 자료형으로 바꾼 후에 투포인터로 처리한다.
loop 한 번에 처리 가능하므로 O(n)으로 처리할 수 있다.
3. 구현 코드
class Solution:
def reverseVowels(self, s: str) -> str:
s_list = list(s)
i, j = 0, len(s) - 1 # 맨 앞과 뒤를 포인팅
vowel = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
while i < j:
while i < j and s_list[i] not in vowel: # 앞쪽 포인터가 자음이면
i += 1
while i < j and s_list[j] not in vowel: # 뒤쪽 포인터가 자음이면
j -= 1
if s_list[i] in vowel and s_list[j] in vowel: # 두 포인터가 가리키는 값을 스왑
s_list[i], s_list[j] = s_list[j], s_list[i]
i += 1
j -= 1
return ''.join(s_list)
입력 값으로 주어진 s를 str에서 list로 변경할 때
기존의 s를 s = list(s)로 변경하면 런타임이 크게 증가하므로 반드시 새로운 변수로 list(s)를 받도록 하자.