[프로그래머스] 수열과 구간 쿼리 2

badassong·2023년 8월 11일
0

JS

목록 보기
27/31
post-thumbnail

문제

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.

각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.

각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.


내가 푼 방법

function solution(arr, queries) {
  let answer = [];
  for (let i = 0; i < queries.length; i++) {
    let newArr = [];
    for (let j = queries[i][0]; j <= queries[i][1]; j++) {
      if (arr[j] > queries[i][2]) newArr.push(arr[j]);
    }
    answer.push(Math.min(...newArr));
    if (Math.min(...newArr) === Infinity) {
      answer.push(-1);
    }
  }
  answer = answer.filter((el) => el !== Infinity);
  return answer;
}

for문의 중첩으로 코드 해석이 힘들다!

for 문으로 단순하게 반복하고 있을 땐
내가 뭔가 잘못하고 있는거 같은데... 라고 생각하자!!


Solution 😆

slice와 filter를 이용한 방법이다.

function solution(arr, queries) {
    return ex30FindMinValues(arr, queries);
}

function ex30FindMinValues(arr, queries) {
  const answer = [];

  for (const [start, end, threshold] of queries) {
    const filteredArr = arr.slice(start, end + 1).filter(value => value > threshold);

    if (filteredArr.length === 0) {
      answer.push(-1);
    } else {
      answer.push(Math.min(...filteredArr));
    }
  }

  return answer;
}
profile
프론트엔드 대장이 되어보쟈

0개의 댓글