지난 게시글에 이어, 이번엔 문자열 인덱싱에 대해 다뤄보도록 한다.
문자열 인덱싱에 대해 공부한 후, 간단히 연습할 수 있는 문제를 풀어봤다.
💻 프로그래머스 : 가운데 글자 가져오기 - 문제 링크
Swift의 문자열은 C나 Python처럼 정수 인덱싱이 허용되지 않는다.
대체 왜 그런고 하니, Swift의 Character는 여러개의 스칼라 값이 모여서 만들어진 것이기 때문에, 정수로 인덱싱했을 경우 정확히 어떤 값을 가리키는지도 모르고, 원하는 값이 출력되지 않을 것이기 때문이다.
자세한 내용은 해당 블로그에 설명이 잘 되어 있다.
대신, Swift 에서는 String.index 라는 자료형을 사용하거나, String을 Array로 변환하여 인덱스에 접근한다.
let str = "Hello, Swift!"
let index = str.index(str.startIndex, offsetBy: 7)
let character = str[index]
print(character) // "S"
let string = "Hello, Swift!"
let charactersArray = Array(string)
let firstCharacter = charactersArray[0] // 'H'
let sixthCharacter = charactersArray[5] // ','
print("첫 번째 문자: \(firstCharacter)")
print("여섯 번째 문자: \(sixthCharacter)")
String 자체가 배열이기 때문에 Array로 바로 받을 수 있다. 보다 직관적이고 다른 문자의 방식과 비슷하지만, Array로 받을 경우 전체 문자열이 메모리에 복사되기 때문에 큰 문자열을 처리할 때는 유의해야 한다.
공부한 내용을 바탕으로 위 문제를 풀어보자.
func solution(_ s:String) -> String {
let strlen = s.count
if strlen % 2 == 0 {
return String(Array(s)[(strlen/2 - 1)...strlen/2])
} else {
return String(Array(s)[strlen/2])
}
}
func solution(_ s:String) -> String {
let strlen : Int = s.count
if strlen == 1 {
return s
}
let strIdx = s.index(s.startIndex, offsetBy: (strlen / 2) - 1)
let strIdx2 = s.index(s.startIndex, offsetBy: (strlen / 2))
if strlen % 2 == 0 {
return String(s[strIdx...strIdx2])
} else {
return String(s[strIdx2])
}
}