연습장

30. 수열과 구간 쿼리 2 본문

프로그래머스/0단계

30. 수열과 구간 쿼리 2

js0616 2023. 6. 23. 22:22

Q. 정수 배열 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

 


 

queries 의 원소는 다음과 같다.

[index1,index2 , value]

 

index1 과 index2 사이의 값 j 에 대해서 arr[j] 가 value 값보다 큰 arr[i] 중 가장 작은 arr[j] 를 answer 에 넣는다. 

 

이를 queries 에 들어있는 원소의 갯수 만큼 동작을 수행한다. 

 

예시는 총 3번 실행하게된다.

[0,4,2]  , [0,3,2] , [0,2,2]  

 

ans = [] // 임시 변수 : value 보다 큰 arr[j] 들을 모아놓음

그리고 그 중 가장 작은 원소하나만 answer 에 저장한다. 

value 보다 큰 arr[j] 가 없을경우 -1 을 추가한다.


function solution(arr, queries) {
    let answer = []; 
    
    for(let i =0 ; i< queries.length ; i++){     // i = 0 1 2 로 각각 queries 의 원소를 가져옴 
        let ans = []; // 임시 변수 : value 보다 큰 arr[j] 들을 모아놓음
    for(let j = queries[i][0] ; j <= queries[i][1] ; j++){ // j = 01234 0123 0123 로 arr[j]  값이 value 값과 비교하기위해
            if (arr[j]>queries[i][2]){
                ans.push(arr[j])   
            }
        }
        // console.log(ans) // 4,3  / 4 / ''
        if (ans.length > 0) {
            answer.push(Math.min(...ans)) // ans 에서 가장 작은 원소 하나만 선택하기 위해
        }
        else{
            answer.push(-1) // value 값보다 큰 원소가 없을 경우 -1 을 추가 하기 위해서
        }
    }
    return answer
}

 


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);
}

배열로 되어있는 원소를 [s,e,k ] 로 가져옴 
s 에서 e 까지 원소를 arr에서 slice 로 가져옴

 

filter 함수

arr.filter(callback(element[, index][, array])[, thisArg])

배열을 돌며 각 요소에 대해 콜백함수의 조건에 맞는(true) 인 요소만 모아서 return 한다. 

 

위의경우 n > k 를 만족하는것 즉 

slice 한 원소들 중 한개씩 -> n 이 되며  k 는 queries 의[index1,index2 , value] 중 value 로 볼 수 있다. 

만족하는 것을 배열로 만들고

 

정렬하면 오름차순 정렬되기때문에 0번째 인덱스는 가장작은 값이 되며 

|| 아니면 -1 을 넣겠다는 뜻인거같다. 

 

 

굉장히 복잡해보인다. 자주보면 익숙해질까.. 

 

 

 

'프로그래머스 > 0단계' 카테고리의 다른 글

32. 배열 만들기 2  (0) 2023.06.23
31. 수열과 구간 쿼리 4  (0) 2023.06.23
29. 수열과 구간 쿼리 3  (0) 2023.06.23
28. 수 조작하기 2  (0) 2023.06.20
27. 수 조작하기 1  (0) 2023.06.20