티스토리 뷰

코딩테스트

Lv.0 swift 배열 만들기 3

알롱도담쓰 2024. 3. 23. 21:34

문제 설명

정수 배열 arr와 2개의 구간이 담긴 배열 intervals가 주어집니다.

intervals는 항상 [[a1, b1], [a2, b2]]의 꼴로 주어지며 각 구간은 닫힌 구간입니다. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다.

이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.

제한 조건

1 ≤ arr의 길이 ≤ 100,000
1 ≤ arr의 원소 < 100
1 ≤ a1 ≤ b1 < arr의 길이
1 ≤ a2 ≤ b2 < arr의 길이

내 답안

import Foundation

func solution(_ arr:[Int], _ intervals:[[Int]]) -> [Int] {
    var result = [Int]()
    
    for i in intervals {
        var a = i[0]
        var b = i[1]
        
        var aIndex = arr.index(arr.startIndex, offsetBy: a)
        var bIndex = arr.index(arr.startIndex, offsetBy: b)
        
        result.append(contentsOf: arr[aIndex...bIndex])
    }
    
    return result
}

접근 방법

  1. 양 끝값의 인덱스를 구해서,
  2. 그 인덱스를 배열에 추가

다른 풀이

func solution(_ arr: [Int], _ intervals: [[Int]]) -> [Int] {
    return intervals.flatMap { ints in Array(arr[ints[0]...ints[1]]) }
}

 

 

 

알게 된 것

flatMap에 대해서 잘 이해가 안 갔는데 이 풀이를 보면서 조금 이해가 갔다

 

arr = [1, 2, 3, 4, 5, 6]

intervals = [[1, 3], [4, 5]] 가 있을 때

 

ints = [1, 3] 이고

따라서 ints[0] = 1 / ints[1] = 3이 된다

 

여기서 flatMap을 쓴 이유인데

 

intervals이 2차원 배열이기 때문에 클로저를 실행시키면 

[[1부터 3까지의 배열], [4부터 5까지의 배열]] 이렇게 2개의 배열 요소로 이루어진 배열이 반환되는데

이걸 1차원 배열로 만들어주기 위해서이다

 

 

'코딩테스트' 카테고리의 다른 글

Lv.0 swift 날짜 비교하기  (0) 2024.03.25
Lv.0 swift 세로 읽기  (0) 2024.03.24
Lv.0 swift 접미사 배열  (0) 2024.03.23
Lv.0 swift 수 조작하기2  (0) 2024.03.23
Lv.0 부분 문자열 이어 붙여 문자열 만들기  (0) 2024.03.22
최근에 올라온 글