<Programmers> 수열과 구간 쿼리2

·2025년 4월 2일
0

프로그래머스

목록 보기
16/18
post-thumbnail

문제

정수 배열 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를 초기값으로 사용하는 것은 효율적입니다. 그 이유는 다음과 같다.

  1. 단일 비교로 후보 업데이트:
    Infinity는 모든 실수보다 큰 특별한 숫자이므로, 조건을 만족하는 첫 번째 값이 반드시 Infinity보다 작게 되어 후보 값으로 바로 업데이트됩니다. 초기값이 Infinity이면, 별도의 “초기값 설정 여부”를 확인할 필요 없이 단순 비교로 처리할 수 있습니다.

  2. 불필요한 조건문 제거:
    만약 null이나 undefined로 초기화할 경우, 첫 번째 값을 대체할 때 별도의 조건(예: 후보 값이 설정되어 있는지 확인)을 추가로 체크해야 할 수 있습니다. Infinity를 사용하면 이런 추가 조건문 없이 바로 비교할 수 있어 코드가 간결해지고, 이에따른 성능 면에서도 약간의 이점이 있습니다.

  3. 가독성과 유지보수성:
    코드가 명확해지면서, “Infinity보다 작은 값을 찾는다”라는 논리 자체가 직관적으로 이해되므로, 추후 유지보수나 디버깅 시에도 도움이 됩니다.

즉, Infinity를 사용하면 비교 연산이 간단해지고 불필요한 분기 처리를 줄일 수 있어 코드의 효율성과 가독성이 높아진다.

정리

  1. 최소값을 구할 때에는 최초 기준값을 Infinity로 설정하면 효율적이다.
  2. 값을 비교할 때에만 사용할 것. json data로 변환할 때에 의도하지 않은 이슈가 터질 수 있음. 이건 다음에 마주하게 될 때에 다시 정리
profile
- 배움에는 끝이 없다.

0개의 댓글