Algorithm/LeetCode

452. Minimum Number of Arrows to Burst Balloons

사랑우주인 2024. 10. 16. 20:45

문제

그리디 알고리즘 문제였다. 풍선의 위치(지름)가 범위로 표현되어 주어진다. 여러 풍선이 주어지고, 최대한 적은 갯수의 화살로 모든 풍선을 터트리는 문제였다. 풍선은 겹칠 수 있다(위치 범위가 일부 겹칠 수 있다).

 

그리디 알고리즘이란 Greedy(탐욕, 욕심쟁이) 이름 처럼 지금 당장 최적의 답을 선택하는 과정을 반복하여 결과를 도출하는 알고리즘이다.

 

링크: https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons

Solution 1

class Solution {
    public int findMinArrowShots(int[][] points) {
        int answer = 1;
        Arrays.sort(points, Comparator.comparingInt(o -> o[0]));
        int start = points[0][0];
        int end = points[0][1];
        for(int i = 1; i< points.length; i++) {
            int[] cur = points[i]; 

            start = Math.max(cur[0],start);
            end = Math.min(cur[1], end);

            if(start>end) {
                start = cur[0];
                end = cur[1];
                answer++;
            }
        }
        return answer;
    }
}

화살의 위치를 이동하며 최적의 화살 개수를 도출 가능한지 시도해보았다. 인접한 풍선의 위치 범위가 겹치는 경우, 동일한 화살을 사용할 수 있고, 겹치지 않으면 화살이 추가로 필요하다 사실을 알게 됐다.

이를 위해 풍선 위치 배열인 points를 정렬하여, 각 풍선의 위치를 순차적으로 탐색하고 인접한 풍선 간의 겹침 여부를 쉽게 확인할 수 있도록 하였다.

start = Math.max(cur[0],start);
end = Math.min(cur[1], end);
            
if(start>end) {
                start = cur[0];
                end = cur[1];
                answer++;