Lv3의 그리디 알고리즘을 사용하는 문제입니다.
문제 설명
고속도로를 이동하는 모든 차량이 고속도로를 이용하면서 단속용 카메라를 한 번은 만나도록 카메라를 설치하려고 합니다.
고속도로를 이동하는 차량의 경로 routes가 매개변수로 주어질 때, 모든 차량이 한 번은 단속용 카메라를 만나도록 하려면 최소 몇 대의 카메라를 설치해야 하는지를 return 하도록 solution 함수를 완성하세요.
제한사항
- 차량의 대수는 1대 이상 10,000대 이하입니다.
- routes에는 차량의 이동 경로가 포함되어 있으며 routes[i][0]에는 i번째 차량이 고속도로에 진입한 지점, routes[i][1]에는 i번째 차량이 고속도로에서 나간 지점이 적혀 있습니다.
- 차량의 진입/진출 지점에 카메라가 설치되어 있어도 카메라를 만난것으로 간주합니다.
- 차량의 진입 지점, 진출 지점은 -30,000 이상 30,000 이하입니다.
입출력 예
routes | return |
[[-20,15], [-14,-5], [-18,-13], [-5,-3]] | 2 |
입출력 예 설명
-5 지점에 카메라를 설치하면 두 번째, 네 번째 차량이 카메라를 만납니다.
-15 지점에 카메라를 설치하면 첫 번째, 세 번째 차량이 카메라를 만납니다.
<내 풀이>
차가 들어오는 시간을 기준으로 오름차순 정렬해준 후
가장 먼저 들어온 차를 기점으로 다음 차와 비교하며 카메라 설치 개수를 체크합니다.
이전 차가 고속도로를 나가는 시간이 새로 들어온 차의 나가는 시간보다 크다면
새로 들어온 차와 같은 카메라를 지날 수 있으며 더 작은 통과범위를 가지므로
새로 들어온 차를 pre_car로 업데이트해준다.
그리고 이전 차가 더 큰 범위를 갖지는 않지만
새로 들어온 차의 들어오는 시간이 이전차가 나가는 시간 보다 클 경우
새로 들어온 차는 이전 차와 같은 카메라를 지날 수 없게됩니다.
따라서 카메라 개수를 증가시켜주고 새로운 기준이 될 pre_car를 업데이트 해줍니다.
내 코드
import java.util.*;
class Solution {
public int solution(int[][] routes) {
Arrays.sort(routes, new Comparator<int[]>() {
public int compare(int[] arr1, int[] arr2) {
if( ((Comparable)arr1[0]).compareTo(arr2[0]) > 0 ){
return 1;
}
else{
return -1;
}
}
});
int[] pre_car = routes[0];
int cam = 1;
for(int i=1; i<routes.length; i++){
if(pre_car[1]>routes[i][1]){
pre_car = routes[i];
}
else if(pre_car[1]<routes[i][0]){
cam++;
pre_car = routes[i];
}
}
return cam;
}
}
문제 출처: https://programmers.co.kr/learn/courses/30/lessons/42884?language=java
'알고리즘 > 문제풀이' 카테고리의 다른 글
[프로그래머스] 단어 변환 문제 (0) | 2020.02.04 |
---|---|
[프로그래머스] 네트워크 문제 (0) | 2020.02.03 |
[프로그래머스] 섬 연결하기 문제 (0) | 2020.01.31 |
[프로그래머스] 구명보트 문제 (0) | 2020.01.31 |
[프로그래머스] 이중우선순위 큐 문제 (0) | 2020.01.29 |