2785. Sort Vowels in a String
문제 설명
- 문자열 주어짐
- 문자열에서 자음은 그대로두고
- 모음만 이제 모음끼리 아스키코드 비교해소 모음끼리만 순서바꾸기 (대문자도 존재)
문제풀이
두개를 저장해야할 것 같은데,
1. 첫번째는 모음의 인덱스 위치값
2. 두번째는 그 인덱스 위치값을 모은 배열
첫번째는 그냥 s를 가공하지 않은 상태에서 for문 돌려주면 될 것 같아서, 2번만 잘 만들어주면 될 것 같았다.
모음 찾아서 모아주기
var vowel = ["A", "E", "I", "O", "U", "a", "e", "i", "o", "u"] // 모음들만 있는 인덱스 찾아주기 var vowels_list = s.filter { vowel.contains(String($0)) }
일단 다음과같이 모음을 찾아서 모아줬다.
class Solution {
func sortVowels(_ s: String) -> String {
var vowel = ["A", "E", "I", "O", "U", "a", "e", "i", "o", "u"]
// 모음들만 있는 인덱스 찾아주기
var vowels_list = Array(s.filter {
vowel.contains(String($0))
})
vowels_list.sort { $0.asciiValue! < $1.asciiValue! }
var s = Array(s)
var cursor = 0
for (index, item) in s.enumerated() {
if vowels_list.contains(item) {
s[index] = vowels_list[cursor]
cursor += 1
}
}
return s.map { String($0) }.joined(separator: "")
}
}
Filter
에 sort
에 또 n으로 반복문돌려주고 Array로 만들어주는 것도 있고 딱히 효율적인 코드는 아니라고 생각하긴 했는데, 여기서 그럼 좀 로직을 단축시켜봤다.
바꿔야할 index를 파악해서 s에 해당 인덱스로 접근하면서 바꿔주는 느낌으로 수정했다. 이러면 쪼금은 나아질 것처럼 보였으므로..
class Solution {
func sortVowels(_ s: String) -> String {
var vowel = ["A", "E", "I", "O", "U", "a", "e", "i", "o", "u"]
// 모음들만 있는 인덱스 찾아주기
var vowel_idx = [Int]()
var vowels_list = [Character]()
var s = Array(s)
var cursor = 0
for (index, item) in s.enumerated() {
if vowel.contains(String(item)) {
vowels_list.append(item)
vowel_idx.append(index)
}
}
vowels_list.sort { $0.asciiValue! < $1.asciiValue! }
for (idx, item) in vowel_idx.enumerated() {
s[item] = vowels_list[idx]
}
return s.map { String($0) }.joined(separator: "")
}
}
타인의 코드
class Solution {
func sortVowels(_ s: String) -> String {
let allVovels: Set<Character> = ["a", "e", "o","u", "i", "A", "E", "O","U", "I"]
var sVovels = s.filter { allVovels.contains($0)}.sorted()
var rezult = ""
var vowelIndex = 0
for char in s{
if (allVovels.contains(char)) {
rezult.append(sVovels[vowelIndex])
vowelIndex += 1
} else {
rezult.append(char)
}
}
return rezult
}
}
많이 다를줄 알았는데 생각보다 엄청 비슷해서 신기했다.
1.모음만 따로 배열을 만들어준 것은 생각이 일치했는데, Set을 사용해 모음을 관리해준 걸 볼 수 있었다. 나도 다음에 비슷한 상황에서는 SET을 좀 활용해야겠다고 생각했다.
2. 큰 차이는, 결과 문자열을 생성할 때 원본 문자열 순회하면서 빈문자열에 차례대로 넣어주는 것이었는데, 이러면 joined도 할 필요없고, 훨씬 단축될 것이다.
Q : 문자열에 왜 += 을 안쓰고 append를 해줬나요? 그래도 되나요?
나도 이게 신기해서 좀 찾아보니까
append는 String타입의 메소드로 , Character을 추가할 때 사용해줄 수 있다고 한다.
<Array의 append메소드랑 다른것>
그래서 그게 싫다면 += String(char)을 해주면 될 것!