정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.
각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.
제한사항
function solution(arr, queries) {
let answer = []
for (let [s, e, k] of queries) {
let result = arr.filter((v, i) => i>=s && i<=e && v>k).sort((a, b) => a-b)[0];
answer.push(result ? result : -1);
}
return answer;
}
아직 난 갈 길이 멀었다... filter() 함수를 써보려고 하는데 익숙하지가 않아서 계속 잘못 풀고 망쳐서 결국 다른 사람의 풀이를 조금 참조했다.
filter()
) sort()
메서드를 사용해 필터링 된 요소들을 오름차순으로 정렬한다. 그 중 가장 작은 결과를 result 변수에 담는다. (sort((a, b) => a-b)[0]
) 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);
}
map() 함수를 사용할 수도 있군!!!
map()
함수로 순회한다. 여기서도 구조 분해 할당을 사용하여 각 쿼리의 [s, e, k] 값을 추출한다. arr.slice(s, e+1)
를 호출하여 s 인덱스부터 e 인덱스까지의 부분 배열을 생성한다. 그 후 filter() 함수를 통해 k보다 큰 값들을 필터링 한 후 오름차순으로 정렬한다. function solution(arr, queries) {
return queries.map(([s, e, k]) => {
let result = -1
for (let i = s; i <= e; i += 1) {
const v = arr[i]
if (v <= k) continue
result = result === -1 ? v : Math.min(result, v)
}
return result
})
}
여기도 map() 함수를 사용했다!
continue
를 사용하여 루프의 다음 반복으로 넘어간다. 흠... 이 풀이는 이해가 좀 어려웠다. 다시 봐도 이해가 잘 안 되는데 차근차근 다시 보자~