[프로그래머스 | Swift | Lv.0] 배열 만들기 5

Juhee Kim·2025년 5월 5일

알고리즘 풀이

목록 보기
7/9

문제 링크


풀이 1: 배열 인덱스

import Foundation

func solution(_ intStrs:[String], _ k:Int, _ s:Int, _ l:Int) -> [Int] {
    return intStrs.compactMap {
        Int(String(Array($0)[s...s+l-1]))
    }.filter { $0 > k }
}

설명

  • String을 Array로 변환하면 각 요소는 Character 타입이 된다.

  • Character ↔️ Int 형변환은 불가
    Character 요소를 String 타입으로 변환 후, Int로 변환

  • map을 사용하면 [Int?] 타입이 반환되기에 강제언래핑 대신 compactMap 사용

💡 map VS compactMap
map: 옵셔널 타입 결과를 그대로 유지
compactMap: nil 값은 제거하여 결과는 항상 non-optional


다른 사람의 풀이: prefix / suffix

func solution(_ intStrs: [String], _ k: Int, _ s: Int, _ l: Int) -> [Int] {
    return intStrs.map { Int($0.prefix(s + l).suffix(l))! }.filter { $0 > k }
}

설명

prefix와 suffix 작동 방식

  1. prefix(n) 함수:

    • 문자열의 시작부터 지정된 개수(n)만큼의 문자를 포함하는 부분 문자열을 반환한다.
    • 예: "Hello".prefix(2)"He"를 반환한다.
  2. suffix(n) 함수:

    • 문자열의 끝에서부터 지정된 개수(n)만큼의 문자를 포함하는 부분 문자열을 반환한다.
    • 예: "Hello".suffix(2)"lo"를 반환한다.

코드 실행 과정

  • $0.prefix(s + l): 문자열의 처음부터 s + l개의 문자를 가져온다.
    → 필요없는 뒷 문자열 버리기

  • .suffix(l): 그 결과에서 마지막 l개의 문자를 가져온다.
    → 필요없는 앞 문자열 버리기

  • 결합하면, 인덱스 s부터 시작하여 길이 l만큼의 부분 문자열을 얻게 된다.


이전 포스팅에서 문자열 인덱스를 처리하려면 배열로 만든 후 배열의 인덱스를 사용하면 편하다고 작성했다.
오늘은 다른 사람의 코드를 보며 그 방법만 있는게 아니구나, prefix / suffix를 이용하면 번거로운 형변환 작업을 줄일 수 있구나 깨달았다.
까다로운 swift 문자열을 상대할 무기를 하나 더 얻은 기분이다.👊

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

0개의 댓글