Swift/Code Kata (알고리즘)

[Swift|코드카타] (프로그래머스) 입문 #30. 가운데 글자 가져오기 - String.index 대신 배열로 쪼개어 풀자

yurim-dev 2024. 3. 4. 19:32

🔴 문제

문제 설명
단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

제한사항
s는 길이가 1 이상, 100이하인 스트링입니다.

입출력 예
s return
"abcde" "c"
"qwer" "we"

 

 

🔵 풀이 1 - string.index 활용

s의 길이가 짝수인 경우와 홀수인 경우로 나누어,

각각 string.index를 활용하여 코드를 짰다.

func solution(_ s: String) -> String {
    let len = s.count
    if len % 2 == 0 {
        let startIndex = s.index(s.startIndex, offsetBy: len / 2 - 1)
        let endIndex = s.index(startIndex, offsetBy: 2)
        return String(s[startIndex..<endIndex])
    } else {
        let startIndex = s.index(s.startIndex, offsetBy: len / 2)
        let endIndex = s.index(after: startIndex)
        return String(s[startIndex..<endIndex])
    }
}

 

☝️ 그런데..!! 튜터님께 여쭤보니,

Swift 에서 String은 숫자형과 문자 길이가 달라, index로 풀기 까다로우므로,

스트링을 배열로 쪼개서 푸는 방법을 추천해주셨다.

 

🔵 풀이 2 - 배열로 쪼개어 풀기

먼저, map을 이용해 인자로 받은 String을 Character 배열로 만든다.

문자열을 배열[Character]로 만드는 방법 : 문자열.map {$0}
s = "abcde"일 경우,
s.map {$0} =  ['a', 'b', 'c', 'd', 'e'] 가 됨. (= [Character])

 

Swift 배열 인덱스는 0부터 시작하므로,

짝수일 경우 배열의 [글자수 / 2 - 1 ... 글자수 / 2] 를 문자열로 바꾸어 반환,

홀수일 경우 배열의 [글자수 / 2] 번째 값을 문자열로 바꾸어 반환한다.

배열을 1개의 문자열로 합치는 방법
[Character]일 경우 -> String(배열)
>> let char = ['a', 'b', 'c', 'd', 'e'] 
String(char) ➡️ "abcde"

[String]
일 경우 -> 배열.joined(seperator: "")
>> let str = ["happy", "sad"
str.joined(seperator: "") ➡️ "happysad"

 

따라서 다음과 같은 코드를 구할 수 있다.

func solution(_ s: String) -> String {
    let str: [Character] = s.map {$0}
    let len: Int = s.count
    let lenHalf : Int = len / 2
    return len % 2 == 0 ? String(str[lenHalf - 1 ... lenHalf]) : String(str[lenHalf])
}