[js] 수열과 구간 쿼리 2 (lv.0, 정답률 80%)

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

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

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

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

제한사항

  • 1 ≤ arr의 길이 ≤ 1,000
    - 0 ≤ arr의 원소 ≤ 1,000,000
  • 1 ≤ queries의 길이 ≤ 1,000
    - 0 ≤ s ≤ e < arr의 길이
    - 0 ≤ k ≤ 1,000,000

😭 나의 풀이

function solution(arr, queries) {
    let answer = []
    for (let [s, e, k] of queries) {
        let result = arr.filter((v, i) => i>=s && i<=e && v>k).sort((a, b) => a-b)[0];
        answer.push(result ? result : -1);
    }
    return answer;
}

아직 난 갈 길이 멀었다... filter() 함수를 써보려고 하는데 익숙하지가 않아서 계속 잘못 풀고 망쳐서 결국 다른 사람의 풀이를 조금 참조했다.

  • 먼저 for문으로 queries를 순회한다. 이 때 구조 분해 할당을 통해 queries 배열의 각 요소(내부 배열)를 순회하며 해당 요소의 값을 s, e, k라는 변수에 각각 할당한다. for...of 명령문 잘 숙지해두기!! 이렇게 쓰는 거 연습 좀 하자~!
  • 각 쿼리에 대해 arr 배열을 순회하면서 인덱스가 s와 e 사이에 있고 해당 값이 k보다 큰 요소만 필터링한다.(filter())
  • 그리고 sort() 메서드를 사용해 필터링 된 요소들을 오름차순으로 정렬한다. 그 중 가장 작은 결과를 result 변수에 담는다. (sort((a, b) => a-b)[0])
  • result 값이 존재할 경우 answer 배열에 추가하고, 존재하지 않는다면 -1을 추가한다.

😯 다른 풀이 1

function solution(arr, queries) {
    return queries.map(([s, e, k]) => arr.slice(s, e + 1).filter((n) => n > k).sort((a, b) => a - b)[0] || -1);
}

map() 함수를 사용할 수도 있군!!!

  • queries의 배열을 map() 함수로 순회한다. 여기서도 구조 분해 할당을 사용하여 각 쿼리의 [s, e, k] 값을 추출한다.
  • arr.slice(s, e+1)를 호출하여 s 인덱스부터 e 인덱스까지의 부분 배열을 생성한다. 그 후 filter() 함수를 통해 k보다 큰 값들을 필터링 한 후 오름차순으로 정렬한다.
  • 필터 후 정렬한 값들 중 가장 작은 값을 선택한다. 만일 undefined 결과가 나올 경우 (빈배열) -1을 반환한다.
  • 각 쿼리에 대해 계산한 값을 반환한다.

🤓 다른 풀이 2

function solution(arr, queries) {
    return queries.map(([s, e, k]) => {
        let result = -1
        for (let i = s; i <= e; i += 1) {
            const v = arr[i]
            if (v <= k) continue
            result = result === -1 ? v : Math.min(result, v)
        }
        return result
    })
}

여기도 map() 함수를 사용했다!

  • map()을 사용하여 구조분해할당을 통해 각 queries로 부터 [s, e, k]를 추출한다.
  • 변수 result를 -1로 초기화한다. 조건을 만족하는 요소가 없을 시 -1을 반환하기 위함이다.
  • s 부터 e까지 반복문을 실행한 후 (for문) 배열 arr에서 각 요소 v를 순회한다.
  • v가 k 이하라면 continue를 사용하여 루프의 다음 반복으로 넘어간다.
  • result가 -1이라면 (조건을 만족하는 요소를 찾지 못했다면 v를 result에 할당한다. 그렇지 않다면 result와 v 중 더 작은 값을 result에 할당한다. 이를 통해 k보다 큰 요소들 중 최솟값을 구할 수 있다.

흠... 이 풀이는 이해가 좀 어려웠다. 다시 봐도 이해가 잘 안 되는데 차근차근 다시 보자~

profile
영차영차 😎

0개의 댓글