연습장
30. 수열과 구간 쿼리 2 본문
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 |