정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k]
꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e
인 모든 i
에 대해 k
보다 크면서 가장 작은 arr[i]
를 찾습니다.
각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1
을 저장합니다.
function solution(arr, queries) {
let resultArr = [];
for (const [s, e, k] of queries) {
let smallestNumber = Infinity;
for (let i = s; i <= e; i++) {
// arr[i]가 k보다 크고, smallestNumber보다 arr[i]가 작을 경우에만 실행
if (k < arr[i] && arr[i] < smallestNumber) {
smallestNumber = arr[i];
}
}
// k < arr[i] 조건을 만족하지 못하면 smallestNumber는 Infinity값을 유지
// Infinity값을 유지하고 있었다면, 조건 충족되는 값이 없었다는 의미기 때문에 -1 할당
resultArr.push(smallestNumber === Infinity ? -1 : smallestNumber);
}
return resultArr;
}
solution(
[0, 1, 2, 4, 3],
[
[0, 4, 2],
[0, 3, 2],
[0, 2, 2],
]
);
// 결과: [3, 4, -1]
핵심:
Infinity
를 사용한 최소값 구하기
Infinity를 초기값으로 사용하는 것은 효율적입니다. 그 이유는 다음과 같다.
단일 비교로 후보 업데이트:
Infinity는 모든 실수보다 큰 특별한 숫자이므로, 조건을 만족하는 첫 번째 값이 반드시 Infinity보다 작게 되어 후보 값으로 바로 업데이트됩니다. 초기값이 Infinity이면, 별도의 “초기값 설정 여부”를 확인할 필요 없이 단순 비교로 처리할 수 있습니다.
불필요한 조건문 제거:
만약 null
이나 undefined
로 초기화할 경우, 첫 번째 값을 대체할 때 별도의 조건(예: 후보 값이 설정되어 있는지 확인)을 추가로 체크해야 할 수 있습니다. Infinity
를 사용하면 이런 추가 조건문 없이 바로 비교할 수 있어 코드가 간결해지고, 이에따른 성능 면에서도 약간의 이점이 있습니다.
가독성과 유지보수성:
코드가 명확해지면서, “Infinity보다 작은 값을 찾는다”라는 논리 자체가 직관적으로 이해되므로, 추후 유지보수나 디버깅 시에도 도움이 됩니다.
즉, Infinity
를 사용하면 비교 연산이 간단해지고 불필요한 분기 처리를 줄일 수 있어 코드의 효율성과 가독성이 높아진다.
Infinity
로 설정하면 효율적이다.