[Swift][프로그래머스] 이상한 문자 만들기 (+버그/오류에 대한 고찰 +components())

팔랑이·2024년 4월 22일
1

iOS/Swift

목록 보기
16/71
post-thumbnail

💻 프로그래머스 : 이상한 문자 만들기 - 문제 링크


👇🏻 첫 번째 코드

import Foundation

func solution(_ s:String) -> String {
    var sarr : [String] = s.split(separator: " ").compactMap{String($0)}
    for i in 0..<sarr.count {
        sarr[i] = sol2(sarr[i])
    }
    return sarr.joined(separator: " ")
}

func sol2(_ ss: String) -> String {
    var ssarr = Array(ss)
    for i in 0..<ssarr.count {
        if i % 2 == 0 {
            ssarr[i] = Character(ssarr[i].uppercased())
        } else {
            ssarr[i] = Character(ssarr[i].lowercased())
        }
    }
    return String(ssarr)
}

도대체 왜 안되나 싶어서 반례를 찾아보니까 문자간 공백이 많으면 그대로 유지가 되어야 한다고. 문제를 읽고 거기까진 생각을 못해서 고려를 안 하고 코드를 짰는데, 저걸 본 후 코드를 다시 짜야한다는 생각에 열받아서 이마를 탁...

왜 저렇게 사소한 부분까지 집착하나 싶기도 하다가, 현실 프로그래밍 할때는 저런 예외 요소들까지 모두 고려해야 버그 없는 코드를 짤 수 있으니 미리 다양한 예외케이스를 학습해두는 것은 오히려 좋다는 마음가짐으로 다시 짰다.

👇🏻 다시 쓴 코드

import Foundation

func solution(_ s:String) -> String {

    let copys = Array(s)
    var newarr : [String] = []
    var count = 0
    for i in copys {
        
        if count % 2 == 0 {
            newarr.append(i.uppercased())
        } else {
            newarr.append(i.lowercased())
        }
        count += 1
        
        if i == " " { count = 0 }
        
    }
    
    return newarr.joined()
}

" "를 만나면 유지하되 count가 초기화되는 방식의 풀이.

👇🏻 다른 사람의 코드

다른 사람의 풀이에서 기존에 내가 쓰고 싶었던 느낌의 코드가 있길래 가져왔다.

import Foundation
func solution(_ s:String) -> String {
    let a = s.components(separatedBy: " ").map { $0.enumerated().map { $0.offset % 2 == 0 ? $0.element.uppercased() : $0.element.lowercased() } }
    return a.map{ $0.map { $0 }.joined() }.joined(separator: " ")
}

내 처음 코드와 메커니즘 자체는 비슷한 것 같은데,
이건 왜 공백이 유지되는가 했더니 split()과 components()의 차이였다.
이하는 이에 대한 GPT의 설명

split(separator:)components(separatedBy:)의 차이

  1. split(separator:):
    • 기본적으로 결과에서 빈 문자열을 제거합니다. 연속된 구분자(예: 공백) 사이에 아무 문자도 없는 경우, 그 결과는 무시됩니다.
    • 예를 들어, "hello world".split(separator: ' ')를 실행하면 ["hello", "world"]만 반환되며, 중간의 공백은 무시됩니다.

  2. components(separatedBy:):
    • 이 메서드는 구분자 사이에 아무 것도 없는 경우에도 빈 문자열을 결과에 포함시킵니다.
    • "hello world".components(separatedBy: " ")를 실행하면 ["hello", "", "", "world"]가 반환됩니다. 즉, 공백 문자열도 배열의 요소로 포함되어 반환됩니다.
profile
정체되지 않는 성장

2개의 댓글

comment-user-thumbnail
2024년 5월 1일

알고리즘 공부 열심히 하시고 계시네요~ 사전캠프 잘 하고 계신가요?

1개의 답글