프로그래머스 - 수열과 구간 쿼리 3 - js
프로그래머스 - 수열과 구간 쿼리 3 - js
문제
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.
각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
제한 사항
1 ≤ arr의 길이 ≤ 1,000
0 ≤ arr의 원소 ≤ 1,000,000
1 ≤ queries의 길이 ≤ 1,000
0 ≤ i < j < arr의 길이
입출력 예
arr | queries | result |
[0, 1, 2, 3, 4] | [[0, 3], [1, 2], [1, 4]] | [3, 4, 1, 0, 2] |
입출력 예 설명
각 쿼리에 따라 arr가 다음과 같이 변합니다.
arr |
[0, 1, 2, 3, 4] |
[3, 1, 2, 0, 4] |
[3, 2, 1, 0, 4] |
[3, 4, 1, 0, 2] |
solution.js
function solution(arr, queries) {
return queries.reduce((acc, cur, idx, origin) => {
const copyAcc = [...acc]
const [to, from] = cur
const box = acc[to]
copyAcc[to] = copyAcc[from]
copyAcc[from] = box
return copyAcc
}, [...arr])
}
- 함수 선언부분으로, arr과 queries를 입력으로 받는다.
- return queries.reduce((acc, cur, idx, origin)) => : 배열을 reduce함수를 사용하여 처리한다. reduce함수는 배열의 모든 요소에 대해 주어진 콜백함수를 실행하고, 콜백함수의 반환 값으 ㄹ누적하여 최종 결과를 반환한다. acc는 누적값으로 현재까지의 결과를 담고있고, cur은 현재 쿼리를 나타낸다. idx는 현재 쿼리의 인덱스를, origin은 원래 queries배열 자체를 나타낸다.
- const copyAcc = [...acc] : acc배열을 복사하여 copyAcc에 저장
- const [to, from]= cur : 현재 쿼리 cur에서 목적지 인덱스 to와 교환할 인덱스 from 을 추출한다. cur은 [to, from ] 형태의 배열로 주어진다.
- const box= acc[to] : to인덱스의 값을 box에 저장한다. 나중에 from 인덱스와 교환할 때 사용
- copyAcc[to] = copyAcc[from]: from 인덱스 값을 copyAcc의 to인덱스로 이동시킨다.
- copyAcc[from] = box : 이전에 저장한 box값을 copyAcc의 from 인덱스로 이동시칸다. 이렇게 하면 to와 from 인덱스 값이 교환된다.
- return copyAcc : 이번 쿼리를 처리한 후의 copyAcc배열을 반환한다.
- }, [...acc]) : reduce함수의 두번째 인자로 arr배열을 넘겨준다. 이 배열을 초기 누적값으로 사용한다.