프로그래머스 요격 시스템 JavaScript

KUKJIN LEE's profile picture

KUKJIN LEE6개월 전 작성

A 나라가 B 나라의 중요 군사 기지를 공격하였습니다. B 나라는 최소한의 비용으로 모든 공격을 막으려고 합니다. 이를 위해, 각 공격이 X축에 평행한 직선으로 표현되며, 요격 미사일은 특정 X 좌표에서 수평으로 발사되어 모든 걸치는 공격을 한 번에 막을 수 있습니다. 하지만 공격의 시작과 끝점에서 발사하는 요격 미사일로는 공격을 막을 수 없습니다. 주어진 공격 목록을 바탕으로, 모든 공격을 막기 위해 필요한 최소한의 요격 미사일 수를 반환하는 함수를 완성해야 합니다.

 

이 함수는 2차원 배열 targets을 받아 처리하는 역할을 합니다. 각 배열은 2개의 요소로 구성되어 있으며, 이 함수의 목적은 이 배열들을 특정 기준에 따라 정렬하고 필터링하여, 일종의 "솔루션"을 구하는 것입니다. 이 코드는 아마도 간격 스케줄링 문제를 해결하기 위한 것으로 보입니다. 이 문제는 간격들을 가능한 한 많이 선택하되, 선택된 간격들이 서로 겹치지 않도록 하는 것입니다.

 

  1. targets 배열을 첫 번째 요소를 기준으로 오름차순 정렬합니다.
  2. checkAnswer 변수는 현재 선택된 간격을 추적합니다.
  3. 모든 배열을 순회하며, 배열이 현재 선택된 배열과 겹치는지 검사합니다.
  4. 현재 배열이 이전에 선택된 배열과 겹치는 경우 (현재 배열의 시작점이 이전 배열의 끝점보다 앞에 있는 경우), 이전 배열의 끝점을 현재 배열의 끝점과 이전 배열의 끝점 중 작은 값으로 설정합니다. 이렇게 하면 겹치는 부분이 최소화됩니다.

 

function solution(targets) {
  let answer = 0;
  targets.sort((a, b) => a[0] - b[0]);

  let checkAnswer = null;

  for (let i = 0; i < targets.length; i++) {
    if (checkAnswer && checkAnswer[1] > targets[i][0]) {
      checkAnswer[1] = Math.min(checkAnswer[1], targets[i][1]);
    } else {
      checkAnswer = targets[i];
      answer++;
    }
  }
  return answer;
}

 

New Tech Posts