728x90
"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