정수 배열 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의 길이
입출력 예
arr | intervals | result |
---|---|---|
[1, 2, 3, 4, 5] | [[1, 3], [0, 4]] | [2, 3, 4, 1, 2, 3, 4, 5] |
입출력 예 설명
입출력 예 #1
첫 번째 구간에 해당하는 배열은 [2, 3, 4] 입니다.
두 번째 구간에 해당하는 배열은 [1, 2, 3, 4, 5] 입니다.
따라서 이 두 배열을 앞뒤로 붙인 배열인 [2, 3, 4, 1, 2, 3, 4, 5]를 return 합니다.
function solution(arr, intervals) {
let result = [];
intervals.map(([a, b], idx) => (
result.push(arr.slice(a, b + 1))
))
return result[0].concat(result[1])
}
이번 문제를 이차원 배열을 활용하는 것 이다.
result라는 빈 배열을 선언하고
intervals를 순환한다.
매개 변수에서 [a,b]
을 통해 구조분해 할당한다.
result에 배열을 push후 concat으로 합쳐 문제를 해결했다.
여기서 문제는 만약 배열안의 배열이 2개 이상인 경우엔 문제가 된다.
intervals.map(([a, b], idx) => (
result.push(arr.slice(a, b + 1))
))
해당 map 메소드를 반환하면
[[...],[...]]
구조가 나오는 문제로
마지막에 concat으로 묶어 준거다.
그럼 처음 push할 때 배열이 아닌 값(숫자)로 넣어주면 되지 않을까 싶었다.
function solution(arr, intervals) {
let result = [];
intervals.map(([a, b], idx) => (
result.push(...arr.slice(a, b + 1))
))
return result
}
spread syntax
문법을 사용했다.
result.push(...arr.slice(a, b + 1))
해주므로써
result에 값이 들어갈 때 배열이 한 겹 벗겨 들어간다.
이전 코드 보다 좀 더 간결해지고 안정적으로 수정 되었다.
function solution(arr, intervals) {
const [[a,b],[c,d]] = intervals;
return [...arr.slice(a, b+1), ...arr.slice(c, d+1)];
}
const [[a,b],[c,d]] = intervals;
이부분이 인상적이였다.
굳이 map 등의 배열 순환 메소드를 사용하지 않아도
구조분해 할당
과 spread syntax 문법
을 활용해 간단 명료하게 문제를 해결하셨다.
다음에 비슷한 문제가 나올 때 사용해 봐야겠다.