
문제를 보고 일단 문자의 길이가 짝수인 경우와 홀수인 경우를 나누어서 풀어야 겠다고 생각했다. 그리고 문자열에 대한 접근은 index로 해야겠다고 생각했다. 생각은 빠르게 해냈지만 문제를 구현하는데는 시간이 꽤 걸렸다. 일단 문자열에 index로 접근하는 것이 힘들었다.
func solution(_ s:String) -> String {
var length = s.count
var result = ""
let index = s.index(s.startIndex, offsetBy: length/2)
if length % 2 != 0 {
result.append(s[index])
} else {
let index1 = s.index(s.startIndex, offsetBy: length/2 - 1)
result.append(s[index1])
result.append(s[index])
}
return result
}
정답은 이렇게 일단 구현하였다. 여기서 else 부분, 즉 문자열의 길이가 짝수일때 길이가 2인 문자열을 반환해야하므로 append 메서드를 두번 사용했는데 효율적이고 예쁘지는? 못하다고 생각해 매달렸던것 같다. 그리고 하면서 또 배운것이 string.index라는 타입이 있다는 것!!!! 즉 string[3]은 에러가 나고 위의 코드처럼 index 메서드를 통해 추출한 string.index타입만 대괄호 사이에 들어가 부분 문자열을 추출할 수 있는 것이다.
🧑🏫 정리하자면...
string.index라는 타입이 있다. 이는 Int와는 완전 다른 타입으로 문자열의 인덱스를 표현하기 위해 사용하는 특수한 타입이다. 문자열을 []로 추출하려면 이 타입을 이용해야함!!
그리고 substring 을 부분문자열로 알고 있었는데 사실 얘도 String과 다른 타입이다!!! 🤦♀️ substring은 원본 문자열의 일부를 가리키는 참조이다. 이 substring을 다시 String으로 바꾸려면 타입변환 String()을 해야한다.
let str = "Hello, World!"
let substring = str.prefix(5) // "Hello"의 substring을 얻습니다.
print(substring) // 출력: "Hello"
print(type(of: substring)) // 출력: Substring
🧑🏫 정리하자면...
substring이라는 타입이 있다. 이는 String과는 다른 타입으로 원본 문자열의 일부를 참조하는데 사용한다.
다른사람들의 풀이도 확인해보았다.
func solution(_ s:String) -> String {
return String(s[String.Index(encodedOffset: (s.count-1)/2)...String.Index(encodedOffset: s.count/2)])
}
와우...encodedOffSet는 바이트 인코딩 및 디코딩에서 특정 데이터 위치를 가리키는 용어라고 한다. encodedOffset은 String.Index의 속성으로, 해당 인덱스가 문자열의 시작 부분으로부터 몇 바이트 떨어져 있는지를 나타내고 있다.
func solution(_ s:String) -> String {
if Array(s).count % 2 == 0 {
return String(Array(s)[(s.count/2)-1...(s.count/2)])
}else{
return String(Array(s)[s.count/2])
}
}
또 다른 풀이인데 String이 배열이라는 것을 잘 활용한 풀이여서 인용해왔다.
swift는 정말 섬세한 언어 같다..^^^^^^ 추후에, 아니 이번주내로 string에 대해서 각잡고 정리하고 글을 올리겠다!!!🧑💻