
정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.
단, arr에 2가 없는 경우 [-1]을 return 합니다.
제한사항
function solution(arr) {
const findIndex = (arr) => {
let newArr = arr;
let result = [];
newArr.find((el, i) => {
if(el == 2) result.push(i)
});
return result;
};
let result = findIndex(arr);
return result.length == 0 ? [-1] : arr.slice(result[0], result[result.length - 1] + 1);
}
하지만 이 풀이는 정확한 풀이가 아니다!!!
find() 메서드의 경우 조건에 맞는 첫 번째 요소를 찾는 메서드로 원하는 모든 인덱스를 찾기 위해서는 forEach() 또는 filter()와 같은 반복 메서드를 사용해야 한다.
그런데 어케 된거지...?
function solution(arr) {
const findIndices = (arr) => {
let indices = [];
arr.forEach((el, i) => {
if (el === 2) indices.push(i);
});
return indices;
};
let indices = findIndices(arr);
return indices.length === 0 ? [-1] : arr.slice(indices[0], indices[indices.length - 1] + 1);
}
요런식의 개선이 권장된다.
function solution(arr) {
const from = arr.indexOf(2);
const end = arr.lastIndexOf(2);
return from === -1 ? [-1] : arr.slice(from, end+1);
}
arr.indexOf()를 통해 배열에서 첫 번째로 값이 2인 요소의 인덱스를 찾는다. arr.lastIndexOf()를 통해 배열에서 마지막으로 값이 2인 요소의 인덱스를 찾는다. function solution(arr) {
if (!arr.includes(2)) return [-1];
let left = 0, right = arr.length - 1;
while (arr[left] !== 2) left++;
while (arr[right] !== 2) right--;
return arr.slice(left, right + 1);
}