[프로그래머스 | Swift | Lv.0] 문자열 섞기

Juhee Kim·2025년 4월 25일

알고리즘 풀이

목록 보기
3/9

문제 링크


풀이 1: 초기 풀이

import Foundation

func solution(_ str1:String, _ str2:String) -> String {
    var result: [Character] = []
    
    for n in 0..<str1.count {
        result.append(str1[str1.index(str1.startIndex, offsetBy: n)])
        result.append(str2[str2.index(str2.startIndex, offsetBy: n)])
    }
    
    return String(result)
}

설명

문자열의 n번째 인덱스 접근

result.append(str1[str1.index(str1.startIndex, offsetBy: n)])
  • str1.startIndex: 문자열의 시작 인덱스
  • str1.index(str1.startIndex, offsetBy: n): 시작점에서 n만큼 떨어진 위치의 인덱스
  • str1[계산된 인덱스]: 그 인덱스 위치의 문자

💡 왜 String은 인덱스 접근이 복잡할까?
Swift에서 String은 배열과 달리 정수 인덱스(n)로 직접 접근할 수 없다. 즉, str1[n]과 같은 방식으로 접근이 불가능하다.
Swift의 String은 내부적으로 유니코드를 사용하고, 각 문자가 가변적인 크기를 가질 수 있기 때문에 특별한 인덱스 타입(String.Index)을 사용한다. 따라서 위와 같은 단계가 필요하다.


풀이 2: 간단한 방법

import Foundation

func solution(_ str1: String, _ str2: String) -> String {
    let str1Array = Array(str1)
    let str2Array = Array(str2)
    var result = ""
    
    for i in 0..<str1.count {
        result.append(str1Array[i])
        result.append(str2Array[i])
    }
    
    return result
}

설명

  • 문자열을 먼저 Character 배열로 변환하여 인덱싱을 효율적으로 수행할 수 있다.
    이렇게 하면 매번 index(startIndex, offsetBy:)를 호출하지 않아도 된다.

다른 사람의 풀이

import Foundation

func solution(_ str1:String, _ str2:String) -> String {
    return zip(str1, str2).map { String($0) + String($1) }.joined()
}

설명

zip(str1, str2)
  • zip 함수는 두 시퀀스를 받아 각 시퀀스의 동일한 위치에 있는 요소들을 쌍(tuple)으로 묶어 새로운 시퀀스를 생성한다.
  • 예를 들어, str1 = "abc", str2 = "xyz" 라면, zip은 [('a','x'), ('b','y'), ('c','z')]와 같은 쌍들을 생성한다.
.map { String($0) + String($1) }
  • map은 각 쌍에 클로저를 적용하여 변환한다.
  • 클로저 내에서 $0은 쌍의 첫 번째 요소(str1의 문자), $1은 쌍의 두 번째 요소(str2의 문자).
  • 각 문자를 String으로 변환하고 두 문자열을 합친다.
  • 예를 들어, ('a','x')는 "ax"가 된다.
.joined():
  • 결과적으로 생성된 문자열 배열을 하나의 문자열로 합친다.
  • 예를 들어, ["ax", "by", "cz"]는 "axbycz"가 된다.

문자열의 인덱스에 접근하고자 할 때에는 문자열을 배열로 만들어 쉽게 접근해보자.

profile
개: 개롭지만 발: 발전하는중

0개의 댓글