맨날 알고리즘 문제를 파이썬 또는 자바로만 풀다가 처음 leetcode에서 자바스크립트를 통해서 풀게 되었다. 2677. Chunk Array, slice 함수 문제는 배열을 원하는 크기 만큼 분할하여 배열에 저장하는 문제인데, 처음에는 slice()
라는 함수의 존재 여부도 모르고 문제를 풀었다.
다른 사람들의 풀이를 보다가 slice()
라는 메서드의 존재 여부를 알게되었다. 따라서 이번 글에서는 이 문제의 풀이와 slice()
메서드의 작동방식을 비슷하게 구현해볼 것이다.
문제
문제는 여기(Leetcode 2677)에서 확인할 수 있다. 이 문제는 앞서 언급했듯이 배열을 원하는 크기 만큼 분할하여 배열에 저장하는 문제이다.
예를 들어 설명하자면 배열과 분할 할 때 원하는 크기를 다음과 같이 입력 받았다고 가정하자.(arr = [1,9,6,3,2], size = 3
)
이때 output으로는 [[1,9,6],[3,2]]
가 반환이 된다. 이 예시처럼 size 대로 분할하고 모자르면 모자른 대로 그룹을 만들면 된다. 만약 size>=arr.length
라면 arr
을 그대로 담은 배열(즉, 2차원 배열)을 반환하면 된다.
풀이 코드와 문제 접근
풀이 코드부터 바로 보자면 다음과 같다 :
/**
* @param {Array} arr
* @param {number} size
* @return {Array}
*/
var chunk = function (arr, size) {
const result = [];
for (let i = 0; i < arr.length; i += size) {
result.push(arr.slice(i, i + size));
}
return result;
};
문제의 핵심 요소는 반복문을 돌 때 i
를 1씩 증가하는 것이 아니라 size
만큼 증가시켜서 하나하나 계산하지 않고, i
~ i+size
까지만 배열에 담는 것이다.
이때 나는 slice()
라는 메서드의 개념을 몰라서 아래와 같이 코드를 짰었다 :
/**
* @param {Array} arr
* @param {number} size
* @return {Array}
*/
var chunk = function (arr, size) {
const result = [];
for (let i = 0; i < arr.length; i += size) {
result.push(arrSlice(arr, i, i + size));
}
return result;
};
const arrSlice = (arr, start, end) => {
let output = [];
for (let i = start; i < end; i++) {
if (arr[i] != null) output.push(arr[i]);
}
return output;
};
처음에는 if (arr[i] != null)
없이 그냥 push
했지만, null
이 배열에 담기는 상황을 보고 조건을 추가하였다. 완벽하게 slice
를 구현한 것은 아니지만, 문제 풀이에 지장이 없을 정도로만 비슷하게 구현하였다.
마무리
공부한 것을 저만의 방식으로 작성한 글입니다. 따라서 틀린 정보가 공유될 수도 있으니 참고만 하되 꼭 공식문서를 통해서 공부하시길 바랍니다! 또한 틀린 부분 지적해주시면 감사하겠습니다!