요격 시스템

Anwooseong·2023년 8월 28일

알고리즘

목록 보기
3/3

문제

Arrays.sort 참고
문제를 읽었을 때, 바로 생각났던 것은 정렬만 올바르게 하면 결과뽑는거는 앞에서부터 차근차근 해결해나가면 되겠다라는 것이었다. 처음에 정렬을 어떻게 활용해야 될까라는 것에 고민을 많이 했다. 이것과 관련된 것 중에서 Arrays.sort와 Collections.sort가 있다는 것을 알았다. Arrays는 배열에 사용되고 Collection은 리스트에서 사용된다. 문제에서는 2차원 배열이 주어졌으므로 Arrays.sort를 활용해서 문제를 풀었다.

import java.util.Arrays;

class Solution {
    public int solution(int[][] targets) {
        int answer = 0;
        Arrays.sort(targets, (o1, o2) -> { return o2[1]-o1[1]; });
        
        double lowPoint = targets[0][0] + 0.1;
        double highPoint = targets[0][1] - 0.1;
        answer++;
        for (int i = 1; i<targets.length; i++){
            int[] target = targets[i];
            if(lowPoint < target[1]){
                if(lowPoint < target[0] || highPoint > target[1]){
                    if(lowPoint < target[0]){
                        lowPoint = target[0] + 0.1; //개구간이여서 0.1의 간격을 주었다.
                    }
                    if(highPoint > target[1]){
                        highPoint = target[1] - 0.1;
                    }
                }
            }else{
                lowPoint = target[0] + 0.1;
                highPoint = target[1] - 0.1;
                answer++;
            }
            
        }
        return answer;
    }
}

코드 해석

제가 푼 이 문제의 핵심은 개구간과 lowPoint이다. y축 기준으로 내림차순을 정렬한 뒤에 lowPoint같은 경우에는 해당 미사일의 s보다 크면 lowPoint를 해당 미사일의 s+0.1하고 highPoint같은 경우에는 e보다 작으면 해당 미사일의 e-0.1을 해준다. 0.1을 하는 이유는 개구간이여서 0.1의 차이를 두는 것이고 lowPoint는 더 크고 highPoint는 더 작게 하는 이유는 y축 기준으로 내림차순을 하여서 lowPoint는 계속 커지고 highPoint가 계속 작아지다가 lowPoint가 해당 미사일의 e보다 작으면 요격 미사일 1개로 최대한 많은 미사일을 요격할 수 있기 때문이다. 이러고 나면 lowPoint가 해당 미사일의 e보다 작아지면 새로운 요격 미사일이 필요하기 때문에 해당 미사일의 s와 e로 0.1의 간격을 두어 lowPoint와 highPoint 초기화하고 난뒤 새로운 요격 미사일이 추가되었기 때문에 answer을 더해주는 식으로 구현하였다.

0개의 댓글