Game Tech Blog

345. Reverse Vowels of a String 본문

Algorithm/LeetCode

345. Reverse Vowels of a String

jonghow 2023. 7. 10. 02:56
반응형

[문제]

Given a string s, reverse only all the vowels in the string and return it.

The vowels are 'a', 'e', 'i', 'o', and 'u', and they can appear in both lower and upper cases, more than once.

 

[TC]

Example 1:

Input: s = "hello"
Output: "holle"

Example 2:

Input: s = "leetcode"
Output: "leotcede"

Constraints:

  • 1 <= s.length <= 3 * 105
  • s consist of printable ASCII characters.

[접근]

이번 문제는 제목에서부터 Reversing 이 있어서, TC만 보면 알것 같았다. 

하지만 함정은 모음만 돌려라 이거였어서, 이렇게 접근했다.

1. 먼저  aeiou 를 스트링에서 뺀다.

2. 리버싱한다.

3. 이제 앞에 나오는 것 가지고 교체해준다.

이를 난, list와 char[] 로 바꿀거 나올때마다 새로 toArrayChar 해주고 다시 new string 으로 덧씌워주고 하려고했다.

(스트링은 인덱스로 문자를 변경할 수 없기때문에..)

다만, Time Limit 이슈가 떠서 stringbuilder로 최적화할겸 변경

 

[코드] C#

=> 많이 지저분하다.

using System.Text;

public class Solution {
    public string ReverseVowels(string s) {
        
        List<char> list = new List<char>();

        StringBuilder sb = new StringBuilder(s);

        for (int i = 0; i < s.Length; ++i)
        {
            if (s[i] == 'a' ||
                s[i] == 'e' ||
                s[i] == 'i' ||
                s[i] == 'o' ||
                s[i] == 'u' ||
                s[i] == 'A' ||
                s[i] == 'E' ||
                s[i] == 'I' ||
                s[i] == 'O' ||
                s[i] == 'U')
            {
                list.Add(s[i]);
            }
        }

        char temp;
        for (int i = 0; i < (list.Count / 2); ++i)
        {
            temp = list[i];
            list[i] = list[list.Count - (1 + i)];
            list[list.Count - (1 + i)] = temp;
        } // Reversing

        for (int i = 0; i < s.Length; ++i)
        {
            for (int j = 0; j < list.Count; ++j)
            {
                if (s[i] == 'a' ||
                    s[i] == 'e' ||
                    s[i] == 'i' ||
                    s[i] == 'o' ||
                    s[i] == 'u' ||
                    s[i] == 'A' ||
                    s[i] == 'E' ||
                    s[i] == 'I' ||
                    s[i] == 'O' ||
                    s[i] == 'U')
                {
                    sb[i] = list[j];
                    list.Remove(list[j]);
                    break;
                }
            }
        }

        return sb.ToString();
    }
}

 

[결과]

[후기]

진짜, 다른건몰라도 런타임 하위5% 처참하다 진짜로..

문제를풀면서 아.. 이거 백타 string 클래스에 있거나 이런거 Linq에 있다고는 생각했다.

한 삼십분가량 함수랑 씨름하면서 풀었는데, 다른사람들 단 2줄 클리어 이런거 보고 현타를 조금 느끼긴했다... Linq를 먼저 공부를 더하고와야하나 싶기도하고....

 

근데, 뇌지컬적으로 잘풀었다는 생각이 든건 처음이었는데 stack LIFO 성질을 이용해서 string에 input 해주는 풀이가 많이 신기했다.. 역시 많이 풀면 저렇게 되나싶었다..

 

이제 Medium 문제인데, 또 한번 잡고 열심히 풀어봐야겠다..

반응형

'Algorithm > LeetCode' 카테고리의 다른 글

238. Product of Array Except Self  (0) 2023.07.14
151. Reverse Words in a String  (0) 2023.07.11
605. Can Place Flowers  (0) 2023.07.10
1431. Kids With the Greatest Number of Candies  (0) 2023.07.07
1071. Greatest Common Divisor of Strings  (0) 2023.07.07
Comments