수열과 구간 쿼리 2 (다른 사람 풀이 참고)

민태영·2023년 7월 13일

문제) 정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다. 각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다. 각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요. 단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

나의 풀이

  1. const s, e, k에queries의 각 쿼리의 범위를 정의한다.

  2. idx가 k보다 크면 arr2에 array[idx]를 저장

  3. answer에 오름차순으로 저장하고 리턴

function solution(arr, paramQue) {
    const array = arr
    const queries = paramQue
    let answer = []
    
    for(let idx = 0; idx < queries.length; idx++) {
        let arr2 = []
        const s = queries[idx][0]
        const e = queries[idx][1]
        const k = queries[idx][2]
        for(let idx = s; idx <= e; idx++) {
            if(idx > k) {
                arr2.push(array[idx])
            }
        }
        
        let minNum = arr2[0]
        arr2.forEach((x) => {
            if(minNum > x) {
                minNum = x
            } 
        })
        if(!minNum) {
            answer.push(-1)  
        } else {
            answer.push(minNum)   
        }
    }
    
    return answer
}

문제점: 테스트는 통과 했으나 런타임에러가 남

다른사람의 풀이

  1. queries의 길이 만큼 for문을 돌린다.

  2. queries[idx]의 요소들을 s, e, k에 구조분해할당 한다.

  3. slice로 s에서 e만큼의 요소를 arr에서 뺴서 subArr에 저장한다.

  4. filter로 subArr안에 있는 요소 중 k보다 큰 요소들을 filterArr에 담는다

  5. filterArr의 길이가 0이라면 answer에 -1를 push하고

  6. filterArr길이가 1이상이면 Math.min으로 가장 작은 요소를 answer에 push한다.

function solution(arr, queries) {
    const answer = []
    
    for(let idx = 0; idx < queries.length; idx++) {
        const [s, e, k] = queries[idx]
        const subArr = arr.slice(s, e + 1)
        const filterArr = subArr.filter((x) => x > k)
        
        if(filterArr.length === 0) {
            answer.push(-1)
        } else {
            const minNum = Math.min(...filterArr)
            answer.push(minNum)
        }
        
    }
    return answer
}
profile
꿈을 꾸는 개발자

0개의 댓글