[js] 2의 영역 (lv.0)

sookyoung.k·2024년 5월 28일
post-thumbnail

정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.

단, arr에 2가 없는 경우 [-1]을 return 합니다.

제한사항

  • 1 ≤ arr의 길이 ≤ 100,000
    - 1 ≤ arr의 원소 ≤ 10

나의 풀이

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() 함수를 통해 값이 2인 요소들의 인덱스를 찾아서 배열로 반환한다.
  • findIndex() 함수를 통해 값이 2인 요소들의 인덱스를 찾는다. 2인 값의 요소가 없는 경우 [-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);
}

요런식의 개선이 권장된다.

다른 풀이 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인 요소의 인덱스를 찾는다.
  • 만약 from이 -1이라면 배열에 2인 요소가 없는 것이므로 [-1]을 반환하고 그렇지 않으면 arr.slice()를 통해 첫 번째와 마짐막 값이 2인 요소 사이의 모든 요소를 포함하는 부분 배열을 반환한다.

다른 풀이 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);
}
  • includes()를 통해서 2를 포함하는 배열인지 아닌지를 확인하고 아니라면 [-1]을 바로 반환해버린다.
  • left와 right 변수를 초기화한다. left는 배열의 시작, right는 배열의 끝 인덱스로 설정한다.
  • while 루프를 돌며 left가 가리키는 값이 2가 될 때까지 증가시킨다.
  • while 루프를 돌며 right의 값이 2가 될 때까지 감소시킨다.
  • slice()를 사용해 left와 right 사이의 부분 배열을 반환한다.
profile
영차영차 😎

0개의 댓글