[프로그래머스] 단속카메라 Java 풀이
PROBLEM
https://programmers.co.kr/learn/courses/30/lessons/42884
SOLUTION
진출 지점을 기준으로 정렬한 후, 탐색하면서 진출 지점에 카메라를 설치한다. 설치된 카메라에 만나지 않으면 해당 차량의 진출 지점에 카메라를 또 설치한다. 이런식으로 반복하면 최소 개수의 카메라를 설치하면서 모든 차량을 만날 수 있다.
처음에는 하나의 카메라를 설치할 때, 최대한 많은 차량이 만나도록 설치를 하면 된다고 생각했다.
- 차량이 가장 많이 겹치는 구간을 찾아서 카메라를 설치한다.
 - 카메라와 만난 차량들을 제거한다.
 - 아직 차량이 남았다면, 1번으로 돌아간다.
 - 그렇지 않으면 모든 차량이 만났으므로 카메라 개수를 반환한다.
 
이렇게 하면 해결은 가능하지만, 이 방식은 구현하는데 복잡한 것 같다고 느껴졌다.
따라서 정렬을 이용하는 방법을 선택했다. 카메라와 아직 만나지 않은 차량에 대해서, 그 차량의 진출 지점에 카메라를 설치하는 것이 이 카메라에 다른 차량들도 최대한 만날 수 있도록 하는 방법이다. 즉, 진출 지점으로 정렬되어 있다면, 순회하면서 차량의 진출 지점에 카메라를 설치하되, 이전에 설치한 카메라와 현재 차량이 만난다면 그 차량을 위한 카메라는 설치하지 않아도 된다.
SOURCE CODE (JAVA)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.*;
class Solution {
  public int solution(int[][] routes) {
    int answer = 0;
    // 진출 지점을 기준으로 정렬
    Arrays.sort(routes, (o1, o2) -> {
      return Integer.compare(o1[1], o2[1]);
    });
    int cameraPos = 0;  // 카메라를 설치했던 지점
    for (int i = 0; i < routes.length; i++) {
      // 카메라를 하나도 설치하지 않았으면
      if (answer == 0) {
        cameraPos = routes[i][1];
        answer++;
        continue;
      }
      // 카메라를 설치한 지점에 만난다면
      if (routes[i][0] <= cameraPos && cameraPos <= routes[i][1]) {
        continue;
      }
      // 카메라 설치
      cameraPos = routes[i][1];
      answer++;
    }
    return answer;
  }
}
OFF THE RECORD
어떻게 이러한 방식을 도출해 냈냐고 물으면 직관적으로 떠올랐다.
      
      
      
      
댓글 남기기