[Swift] [6일차] JadenCase문자열

·2024년 12월 12일
0

SwiftAlgorithm

목록 보기
8/105
import Foundation

func solution(_ s: String) -> String {
    var arr = s.split(separator: " ")

    arr.enumerated().map {
        index, value in
        arr[index] = value.first!.uppercased() + value.dropFirst().lowercased()
    }

    return arr.joined(separator: " ")
}
print(solution("3people unFollowed me"))

에러 발생

/Solution/Sources/Solution/Solution.swift:6:48: error: cannot assign value of type 'String' to subscript of type 'String.SubSequence' (aka 'Substring')
        arr[index] = value.first!.uppercased() + value.dropFirst().lowercased()
var tmp = "3People"
print(type(of: tmp.dropFirst()))  // Substring

그래서 Substring타입이 뭔데 ?

굉장히 쿨한 공식문서
documentSubstring

tmp.dropFirst() 이 친구가 문제인지 알았는데,
value.dropFirst().lowercased() 이 친구는 사실 더해지는 과정에서 lowercased()를 하면 String으로 return이 된다.

print(type(of: s.dropFirst().lowercased())) // String

Array자체가 split을 해주면 Array<SubString> 타입이 되어버려서 이 안에 string타입을 넣을 수 없다는 경고문이었던 것 !

print(type(of: s.split(separator: " "))) // Array<Substring> 

수정 반영

 func solution(_ s: String) -> String {
    var arr = s.split(separator: " ").map { String($0) }
    arr.enumerated().map {
        index, value in
        arr[index] = value.first!.uppercased() + value.dropFirst().lowercased()
    }
    return arr.joined(separator: " ")
 }

split해준거에 map으로 String이 될 수 있게끔 Array<String>이 될 수 있게끔 수정을 해줬더니 문제없이 잘 돌아간다.
자 이제 맞는거 같은데 ?

꽥 ☠️

틀림

질문계시판을 보니 저랑 동일하게 44.4%에서 머무른 사람들이 많았습니다. 좀 더 알아보니,
공백이 1개 이상일때에 대해서 나중에 separator: " "joined해주기 때문에 공백이 하나로 압축되니까 틀린것으로 간주되는 것이었다.

결론 : 공백은 그대로 유지될 수 있도록 코드를 작성해야한다.

func solution(_ s: String) -> String {
    let tmp = Array(s)
    var BlankBefore = true
    var answer = ""
    for item in tmp {
        answer += BlankBefore ? item.uppercased() : item.lowercased()
        BlankBefore = item == " "
    }
    return answer
}
  1. 공백을 만난이후에 첫글자를 uppercased()해주는 것이기 때문에 BlankBefore로 판단해주면서 진행했다.
  2. 첫글자는 uppercased(), 그렇지않으면 lowercased()해주는데, 숫자나 공백은 lowercased()에 영향을 받지 않기 때문에 별도로 처리해줄 필요는없다.
  3. 공백을 만나면 BlankBefore이 true 그렇지 않으면 false가 됨으로 이를 조절해주면서 반복문을 돌리면 해결
정답

후기

시행착오를 겪으면서 특이한 메소드를 또 건질 수 있었다.

  • isFirst : 첫번째 (Optional타입으로 나와서 강제 언래핑(!) 필요)
  • dropFirst() : 첫번째 떨구고 나머지
profile
기억보단 기록을

0개의 댓글