프로그래머스 요격 시스템 JavaScript
KUKJIN LEE • 6개월 전 작성
A 나라가 B 나라의 중요 군사 기지를 공격하였습니다. B 나라는 최소한의 비용으로 모든 공격을 막으려고 합니다. 이를 위해, 각 공격이 X축에 평행한 직선으로 표현되며, 요격 미사일은 특정 X 좌표에서 수평으로 발사되어 모든 걸치는 공격을 한 번에 막을 수 있습니다. 하지만 공격의 시작과 끝점에서 발사하는 요격 미사일로는 공격을 막을 수 없습니다. 주어진 공격 목록을 바탕으로, 모든 공격을 막기 위해 필요한 최소한의 요격 미사일 수를 반환하는 함수를 완성해야 합니다.
이 함수는 2차원 배열 targets을 받아 처리하는 역할을 합니다. 각 배열은 2개의 요소로 구성되어 있으며, 이 함수의 목적은 이 배열들을 특정 기준에 따라 정렬하고 필터링하여, 일종의 "솔루션"을 구하는 것입니다. 이 코드는 아마도 간격 스케줄링 문제를 해결하기 위한 것으로 보입니다. 이 문제는 간격들을 가능한 한 많이 선택하되, 선택된 간격들이 서로 겹치지 않도록 하는 것입니다.
- targets 배열을 첫 번째 요소를 기준으로 오름차순 정렬합니다.
- checkAnswer 변수는 현재 선택된 간격을 추적합니다.
- 모든 배열을 순회하며, 배열이 현재 선택된 배열과 겹치는지 검사합니다.
- 현재 배열이 이전에 선택된 배열과 겹치는 경우 (현재 배열의 시작점이 이전 배열의 끝점보다 앞에 있는 경우), 이전 배열의 끝점을 현재 배열의 끝점과 이전 배열의 끝점 중 작은 값으로 설정합니다. 이렇게 하면 겹치는 부분이 최소화됩니다.
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;
}