프로그래머스 코딩테스트 [ JadenCase 문자열 만들기 ]
Github 링크
- 이 문제는 주어진 String의 각 단어의 첫번째 글짜를 uppercase로 바꾸고, 나머지는 lowercase 즉 JadenCase로 문자열을 변경하는것이다.
- 일단 당연히 공백 문자가 있으니깐 split(separator: " ")를 사용했는데, 공백문자가 하나 이상이 연속으로 나올 수 있다고 하여 찾아보니 방법이 있었다.
s.split(separator: " ", omittingEmptySubsequences: false)
- 위 방법으로 하면 공백문자 또한 split된다. 당연히 separator: " " 를 했으니 , 공백이 3개면 두개만 나오는것이다.
- 그리고 split하면 [subString]으로 나오니깐 map을 이용해서 각각의 요소를 소문자로 우선적으로 바꾸고, 다시 map을 이용해서 각요소의 첫번째 글자를 대문자로 변경할려고 했다.
- 하지만 프로그래머스 컴파일러에서는 map쓰고 또 거기에 map을 쓰니깐 에러가 났다. playground에서는 잘됐는데. 너무 복잡하다는 의미 이기도 하다는 것이다. 그래서 map을 하나만 쓰는 방식으로 변경했다. 그리고 정확하지는 않지만 매개변수와 반환타입을 작성해서 쓰면 더욱 더 정확하게 컴파일러한테 전달이 되서 그런것 같다. 다시 말해 클로저의 반환타입을 컴파일러가 추론을 하지 못해서 생기는 오류인것 같다.
func solution(_ s:String) -> String {
let upper = (Array(s.split(separator: " ",omittingEmptySubsequences: false)).map{ String($0.lowercased())}).map{$0 == "" ? ( $0[$0.startIndex].uppercased() + $0.dropFirst()) : ""}
return upper.joined(separator: " ")
}
func solution(_ s:String) -> String {
let upper = Array(s.split(separator: " ", omittingEmptySubsequences: false)).map {
if $0 == "" {
return ""
} else {
return $0.lowercased().prefix(1).uppercased() + $0.lowercased().dropFirst()
}
}
return upper.joined(separator: " ")
}