[프로그래머스-기초] 배열 만들기 3

JE·2023년 12월 27일
0

코테/코플릿

목록 보기
42/57

배열 만들기 3

문제 설명

정수 배열 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의 길이

입출력 예

arrintervalsresult
[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 문법을 활용해 간단 명료하게 문제를 해결하셨다.

다음에 비슷한 문제가 나올 때 사용해 봐야겠다.

profile
[프론트 애송이] 작은 깨달음도 기록하기

0개의 댓글