풍선들이 존재하는 범위가 주어질 때, 하나의 화살로 해당 범위 내의 모든 풍선을 터트릴 수 있다고 한다. 이때 사용하는 화살의 최소 개수를 구하여라.
그리디 알고리즘을 이용한다. 그리고 그리디 알고리즘은 대체적으로 정렬이 필요하다. 그러나 이때 단순히 o1[1] - o2[1]을 사용하면 안 되는데, 그 이유는 해당 값의 범위가 -2^31과 2^31 사이라 overflow가 일어날 수도 있기 때문이다.
class Solution {
public int findMinArrowShots(int[][] points) {
//단순히 o1[1]-o2[1]을 사용할 수 없다.
//그 이유는 해당 숫자의 값이 -2^31과 2^31 사이라 Integer로 하려면 overflow가 일어난다.
Arrays.sort(points, (o1, o2) ->{
if(o1[1] <= o2[1]){
return -1;
}
return 1;
});
int answer = 1;
//이전의 끝 값
int preEnd = points[0][1];
int xStart, xEnd = 0;
for(int[] p : points){
xStart = p[0];
xEnd = p[1];
//만일 현재의 시작 값이 이전의 끝 값에 포함되지 않는다면
//새로운 화살 필요함
if(preEnd < xStart){
answer++;
//끝 값을 갱신
preEnd = xEnd;
}
}
return answer;
}
}
그리디 알고리즘이란 건 알았지만, 너무 오랜만에 봐서 그런가 어떻게 풀지는 생각하지 못했다. 풀이를 보고 그렇지~ 라고 생각하게 되는 건... 언제나 신경쓰도록 합시다.
https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/description/