티스토리 뷰
문제 설명
고속도로를 이동하는 모든 차량이 고속도로를 이용하면서 단속용 카메라를 한 번은 만나도록 카메라를 설치하려고 합니다.
고속도로를 이동하는 차량의 경로 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 지점에 카메라를 설치하면 첫 번째, 세 번째 차량이 카메라를 만납니다.
접근 방법
먼저, 최소한의 카메라를 설치하기 위해서 어떻게 해야할까를 고민해봤다.
정답은 간단하게, 가장 많이 겹치는 지점을 찾아 카메라를 설치하는 것이었다. 하지만 가장 많이 겹치는 지점, 그 다음 겹치는 지점 또 그 다음 겹치는 지점을 일일이 찾기는 매우 복잡하게 느껴졌다.
따라서 각 지점에 하나씩 카메라를 설치한다고 가정하고(입력 배열의 길이), 겹치는 지점이 발생하면 하나씩 지워 가기로 하였다. 이렇게 겹치는 지점을 찾아가다 보면 그 구간은 계속해서 짧아질 것이다.
그렇다면 그 구간은 어떻게 구할 것인가?
먼저 배열을 진입 지점을 기준으로 오름차순 정렬했다. 겹치는 지점이 끝나고 배열의 뒷 부분에 다시 겹치는 구간이 존재할 경우 해결하기 어렵기 때문이다.
그리고 현재 진입 지점을 다음 진입 지점으로 바꾸고, 진출 지점을 현재 진출 지점과 다음 진출 지점 중 작은 값으로 설정하였다.
현재 진입 지점을 다음 진입 지점으로 설정한 이유는 진입 지점을 기준으로 오름차순 정렬되어 있기 때문이다.
소스 코드
import java.util.*;
class Solution {
public int solution(int[][] routes) {
int answer = routes.length;
Arrays.sort(routes, new Comparator<int[]>(){
public int compare(int[] a1, int[] a2){
return a1[0] - a2[0];
}
});
int start = routes[0][0];
int end = routes[0][1];
for(int i=1;i<routes.length;i++){
if(end >= routes[i][0]){
answer--;
start = routes[i][0];
end = Math.min(end, routes[i][1]);
} else {
start = routes[i][0];
end = routes[i][1];
}
}
return answer;
}
}
처음에는 start, end 변수를 사용한 것이 아니라 아래와 같이 길이 2의 int 배열을 사용하였다.
import java.util.*;
class Solution {
public int solution(int[][] routes) {
int answer = routes.length;
Arrays.sort(routes, new Comparator<int[]>(){
public int compare(int[] a1, int[] a2){
return a1[0] - a2[0];
}
});
int[] current = routes[0];
for(int i=1;i<routes.length;i++){
if(current[1] >= routes[i][0]){
answer--;
current[0] = routes[i][0];
current[1] = Math.min(current[1], routes[i][1]);
} else {
current = routes[i];
}
}
return answer;
}
}
배열을 사용할 경우 문제가 해결되지 않는다. int[] current = routes[0]이나 current = routes[i] 부분에서 current가 주소 값을 저장하기 때문에 current의 값이 수정될 경우 해당하는 routes 배열도 수정되기 때문이다.
처음 자바를 배울 때 주의할 점이라고 교수님께서 알려주셨는데 잊고 있었다. 기본에 충실하자.
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스 고득점 kit]동적계획법 Level3 등굣길 (0) | 2020.12.02 |
---|---|
[프로그래머스 고득점 kit]동적계획법 Level3 N으로 표현 (0) | 2020.11.22 |
[프로그래머스 고득점 kit]탐욕법 Level3 섬 연결하기 (0) | 2020.11.09 |
[프로그래머스 고득점 kit]탐욕법 Level2 구명보트 (0) | 2020.11.07 |
[프로그래머스 고득점 kit]탐욕법 Level2 조이스틱 (0) | 2020.11.05 |