티스토리 뷰
문제 설명
정수 배열 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
}
접근 방법
- 양 끝값의 인덱스를 구해서,
- 그 인덱스를 배열에 추가
다른 풀이
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 |
최근에 올라온 글