Algorithm / JadenCase

알고리즘 코드카타

목록 보기
29/59

문제

프로그래머스 / JadenCase

1) 문제 풀이

func solution(_ s:String) -> String {
    var parts = s.split(separator: " ").map{ String($0) }
    
    for (i, part) in parts.enumerated() {
        let result = part.enumerated().map { (i, j) in
            if i == 0 {
                return j.uppercased()
            } else {
                return j.lowercased()
            }
        }.joined()
        
        parts[i] = result
    }
    
    return parts.joined(separator: " ")
}

결과

2) 코드 개선

❌ 실패 사유

  • 중복된 공백처리가 없음 => omittingEmptySubsequences 사용
func solution(_ s:String) -> String {
    var parts = s.split(separator: " ", omittingEmptySubsequences: false).map{ String($0) }
    
    for (i, part) in parts.enumerated() {
        let result = part.enumerated().map { (i, j) in
            if i == 0 {
                return j.uppercased()
            } else {
                return j.lowercased()
            }
        }.joined()
        
        parts[i] = result
    }
    
    return parts.joined(separator: " ")
}

결과

3) 코드 개선 2

❌ 문제점 분석

  • 비효율적인 문자 변환 => enumerated().map을 매번 사용하여 각 글자를 다시 처리함
  • 문자열 자체가 빈 문자열일 때 처리가 없음 => 입력이 ""일 경우도 그대로 통과하지만, 코드 내 split 이후 로직에서 문제가 될 가능성

✅ 개선 포인트

  • lowercased() 선처리 => 모든 문자를 먼저 소문자로 만들어 일관성 유지
  • first.uppercased() + dropFirst() => 한 글자만 대문자로, 나머지는 소문자 그대로 유지
func solution(_ s:String) -> String {
    return s
        .lowercased()
        .split(separator: " ", omittingEmptySubsequences: false)
        .map { word in
            guard let first = word.first else { return "" }
            return first.uppercased() + word.dropFirst()
        }
        .joined(separator: " ")
}

결과

profile
이유있는 코드를 쓰자!!

0개의 댓글