
import Foundation
func solution(_ str1:String, _ str2:String) -> String {
var result: [Character] = []
for n in 0..<str1.count {
result.append(str1[str1.index(str1.startIndex, offsetBy: n)])
result.append(str2[str2.index(str2.startIndex, offsetBy: n)])
}
return String(result)
}
result.append(str1[str1.index(str1.startIndex, offsetBy: n)])
str1.startIndex: 문자열의 시작 인덱스str1.index(str1.startIndex, offsetBy: n): 시작점에서 n만큼 떨어진 위치의 인덱스str1[계산된 인덱스]: 그 인덱스 위치의 문자💡 왜 String은 인덱스 접근이 복잡할까?
Swift에서 String은 배열과 달리 정수 인덱스(n)로 직접 접근할 수 없다. 즉, str1[n]과 같은 방식으로 접근이 불가능하다.
Swift의 String은 내부적으로 유니코드를 사용하고, 각 문자가 가변적인 크기를 가질 수 있기 때문에 특별한 인덱스 타입(String.Index)을 사용한다. 따라서 위와 같은 단계가 필요하다.
import Foundation
func solution(_ str1: String, _ str2: String) -> String {
let str1Array = Array(str1)
let str2Array = Array(str2)
var result = ""
for i in 0..<str1.count {
result.append(str1Array[i])
result.append(str2Array[i])
}
return result
}
index(startIndex, offsetBy:)를 호출하지 않아도 된다.import Foundation
func solution(_ str1:String, _ str2:String) -> String {
return zip(str1, str2).map { String($0) + String($1) }.joined()
}
zip(str1, str2)
zip 함수는 두 시퀀스를 받아 각 시퀀스의 동일한 위치에 있는 요소들을 쌍(tuple)으로 묶어 새로운 시퀀스를 생성한다..map { String($0) + String($1) }
map은 각 쌍에 클로저를 적용하여 변환한다..joined():
문자열의 인덱스에 접근하고자 할 때에는 문자열을 배열로 만들어 쉽게 접근해보자.