[programmers] 수열과 구간 쿼리 2 - JavaScript
정수 배열 arr와 2차원 정수 배열 queries가 주어지고, 각 query마다 조건을 만족하는 가장 작은 값을 찾아 결과를 반환하는 문제입니다. 주어진 코드는 queries를 반복하면서 arr에서 조건을 만족하는 값을 찾고, 결과를 answer에 저장하는 방식으로 구현되어 있습니다. 또 다른 코드는 for..of 반복문과 filter(), sort() 함수를 사용하여 문제를 해결하는 방식입니다.
Jan 06, 2024
문제 설명
정수 배열
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
입출력 예
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 합니다.
처음 작성한 코드
solution.js
function solution(arr, queries) { let answer=[]; for(let i = 0 ; i < queries.length ; i ++){ const [s,e,k] = queries[i]; let tempMax = Infinity; for(let j = s ; j <= e ; j++) if(arr[j] > k) tempMax = Math.min(tempMax,arr[j]); if(tempMax === Infinity) tempMax =-1; answer.push(tempMax); } return answer; }
핵심 키워드
- for문을 통해 queries의 길이만큼 반복해서 [s, e, k]의 값을 변수로 가져온다.
- 문제에서 제시하는 것보다 큰 값을 max로 설정하고, 만약 arr의 요소 중 조건을 만족하는 값이 있다면 max의 값을 변경한다.
- 만약 arr의 요소 중 조건을 만족하는 값이 없다면 -1을 리턴한다.
- 자바스크립트에서 Infinity 전역 속성은 양의 무한대를 나타내는 숫자 값이다.
다른 코드
solution.js
function solution(arr, queries) { var answer = []; for(let [s,e,k] of queries){ //v->요소값, i-> 순회하는 인덱스 //작은것부터 나열해준다음 제일 작은 0번째 인덱스를 temp에 넣어줌 let temp = arr.filter((v,i)=>(i>=s&&i<=e&&v>k)).sort((a,b)=>a-b)[0]; //temp가 존재하면 temp값을 없으면 -1값을 answer에 넣어준다. answer.push(temp?temp:-1) } return answer }
핵심 키워드
- for.. of 반복문은 일반적으로 배열에 많이 사용된다. 배열의 요소 개수만큼 반복적으로 동작하고, 반복 때마다 각 요소를 사용할 수 있는 변수가 파라미터처럼 주어진다.
- filter() 함수를 통해 조건에 맞는 요소 값들을 찾고, 찾아진 값들을 sort() 함수를 통해 정렬해서 0번째 인덱스의 값을 가져오면 가장 작은 원소를 찾을 수 있다.
결론!
해당 문제를 풀면서 for.. of 문, filter(), sort()함수의 사용법을 익힐 수 있었다.
Share article