본문 바로가기
알고리즘/Programmers

[TIL] 2023.05.17 Programmers_수열과 구간 쿼리 2

by heereal 2023. 5. 17.

수열과 구간 쿼리 2

문제 설명

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

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

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

 

 

입출력 예

arr queries result
[0, 1, 2, 4, 3] [[0, 4, 2],[0, 3, 2],[0, 2, 2]] [3, 4, -1]

입출력 예 #1

  • 첫 번째 쿼리의 범위에는 0, 1, 2, 4, 3이 있으며 이 중 2보다 크면서 가장 작은 값은 3입니다.
  • 두 번째 쿼리의 범위에는 0, 1, 2, 4가 있으며 이 중 2보다 크면서 가장 작은 값은 4입니다.
  • 세 번째 쿼리의 범위에는 0, 1, 2가 있으며 여기에는 2보다 큰 값이 없습니다.
  • 따라서 [3, 4, -1]을 return 합니다.

 

나의 풀이

function solution(arr, queries) {
    let array = [];
    for (const [s, e, k] of queries) {
        let filteredArray = arr.filter((num, i) => i >= s && i <= e && num > k);
        array.push(filteredArray.length ? Math.min(...filteredArray) : -1)
    }
    return array;
}
  1. queries를 for문으로 반복한다.
  2. for문을 반복할 때마다 arr를 query 조건에 맞는 요소들만 flter 한다.
  3. array에 filteredArray의 최솟값을 찾아서 push 한다.
  4. 예외 처리를 위해 삼항연산자로 filteredArray의 length가 0일 경우 array에 -1을 push 하는 경우를 추가한다.
  5. 최종적으로 array를 return 한다.

 

다른 사람의 풀이

function solution(arr, queries) {
    let answer = [];

    for(let i=0;i<queries.length;i++) {
        const [s,e,k] = queries[i];
        const _arr = arr.slice(s,e + 1).filter((v) => v > k).sort((a, b) => a - b);
        answer.push(_arr.length === 0 ? -1 : _arr[0]);
    }

    return answer;
}

arr를 slice 한 후에 filter를 하고 오름차순으로 sort 한 후에 arr[0]을 push한다. slice를 사용한 점이 흥미로웠던 풀이였다.

 

 

 

 

댓글