감자주먹밥

[LeetCode] 345. Reverse Vowels of a String 본문

알고리즘

[LeetCode] 345. Reverse Vowels of a String

JustHm 2023. 6. 22. 19:40
728x90

https://leetcode.com/problems/reverse-vowels-of-a-string/solutions/3329717/swift-solution-beats-100-easy-to-understand/?envType=study-plan-v2&envId=leetcode-75 

 

Swift solution [beats 100%] (easy to understand) - Reverse Vowels of a String - LeetCode

View Nihad_s's solution of Reverse Vowels of a String on LeetCode, the world's largest programming community.

leetcode.com

"hello" 와 같은 문자열의 모음만 reverse 해서 반환하는 문제다.

class Solution {
    func reverseVowels(_ s: String) -> String {
        var result = s.map{String($0)}
        var vowels = s.filter {
            let temp = $0.lowercased()
            if temp == "a" || temp == "e" || temp == "i" || temp == "o" || temp == "u" {
                return true
            } else {
                return false
            }
        }
        
        for (index, char) in result.enumerated() {
            let temp = char.lowercased()
            if temp == "a" || temp == "e" || temp == "i" || temp == "o" || temp == "u" {
                result[index] = String(vowels.removeLast())
            }
        }
        
        return result.joined()
    }
}

먼저 문자열에서 모음만 따로 뺀 후, 원본 문자열을 처음부터 돌며 모음을 찾으면 모음문자열의 마지막 값을 주입해줬다.

대문자도 고려해야 했기에 lowercased 메서드를 사용해 무시를 했다.

하지만 이 방법은 통과는 됐지만, 메모리를 평균보다 많이 쓴 문제가 있었다. 속도도 평균이하 정도..

다른 사람의 솔루션을 보니 굳이 내가 한 선 처리를 할 필요가 없다는 걸 느꼈다.

class Solution {
    func reverseVowels(_ s: String) -> String {
        var s = Array(s)
        let vowels: Set<Character> = ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"]

        var (L, R) = (0, s.count-1)
        while L < R {
            if vowels.contains(s[L]) && vowels.contains(s[R]) {
                s.swapAt(L, R)
                L += 1
                R -= 1
            } else if vowels.contains(s[L]) {
                R -= 1
            } else if vowels.contains(s[R]) {
                L += 1
            } else {
                L += 1
                R -= 1
            }
        }

        return String(s)
    }
}

먼저 모음 템플릿을 만들어 놓고, 양 옆에서 하나씩 옮기면서 비교해 둘 다 모음이라면 교체해주는 작업이였다.

내 솔루션 보다 메모리를 훨씬 적게 쓰면서, 비교도 더 빨리 끝낼 수 있다.

728x90
Comments