코딩 테스트 연습/프로그래머스

[프로그래머스] Level3 단속카메라 (JAVA)

대기업 가고 싶은 공돌이 2025. 2. 3. 14:23

[level 3] 단속카메라 - 42884

문제 링크

성능 요약

메모리: 58.9 MB, 시간: 8.14 ms

구분

코딩테스트 연습 > 탐욕법(Greedy)

채점결과

정확성: 50.0
효율성: 50.0
합계: 100.0 / 100.0

제출 일자

2025년 02월 03일 14:17:51

문제 설명

고속도로를 이동하는 모든 차량이 고속도로를 이용하면서 단속용 카메라를 한 번은 만나도록 카메라를 설치하려고 합니다.

고속도로를 이동하는 차량의 경로 routes가 매개변수로 주어질 때, 모든 차량이 한 번은 단속용 카메라를 만나도록 하려면 최소 몇 대의 카메라를 설치해야 하는지를 return 하도록 solution 함수를 완성하세요.

제한사항

  • 차량의 대수는 1대 이상 10,000대 이하입니다.
  • routes에는 차량의 이동 경로가 포함되어 있으며 routes[i][0]에는 i번째 차량이 고속도로에 진입한 지점, routes[i][1]에는 i번째 차량이 고속도로에서 나간 지점이 적혀 있습니다.
  • 차량의 진입/진출 지점에 카메라가 설치되어 있어도 카메라를 만난것으로 간주합니다.
  • 차량의 진입 지점, 진출 지점은 -30,000 이상 30,000 이하입니다.

입출력 예

routesreturn

[[-20,-15], [-14,-5], [-18,-13], [-5,-3]] 2

입출력 예 설명

-5 지점에 카메라를 설치하면 두 번째, 네 번째 차량이 카메라를 만납니다.

-15 지점에 카메라를 설치하면 첫 번째, 세 번째 차량이 카메라를 만납니다.

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

풀이

dfs로 모든 경우를 다 탐색하는 걸 생각했지만 시간복잡도가 너무 높게 나왔다.

정렬을 이용해 nlogn으로 풀이했다.

 

각 고속도로의 시작 부분을 기준으로 오름차순 정렬을 시킨다.

 

이후 현재 고속도로의 최댓값보다 더 큰 시작 지점을 가진 고속도로가 나오면 cctv의 개수를 늘리고
고속도로의 최댓값을 더 큰 시작 지점을 가진 고속도로의 끝나는 지점으로 만든다.

 

최댓값이 초기화되는 경우는 한 가지가 더 있다. 바로 현재 최댓값보다
현재 탐색중인 고속도로의 끝나는 지점이 더 작은 경우이다. 이 경우에는 cctv의 개수는 늘리지 않고 최댓값만 변경해준다.

 

코드

class Solution {
    public static int solution(int[][] routes) {
        // 첫 번째 원소 기준으로 오름차순 정렬
        Arrays.sort(routes, (a, b) -> Integer.compare(a[0], b[0]));

        int max = routes[0][1];
        int cnt = 1;

        for (int[] route : routes) {
            if(max > route[1]){
                max = route[1];
            }
            if (max < route[0]) {
                cnt++;
                max = route[1];
            }
        }

        return cnt;
    }
}