코딩테스트

프로그래머스 단속카메라(자바) - 그리디

leeeehhjj 2022. 4. 16. 14:27

문제 설명

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

고속도로를 이동하는 차량의 경로 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

 

 

-틀린 코드

import java.util.*;
class Solution {
    public int solution(int[][] routes) {
        int answer = 0;
        int start = 0; //현재 카메라 위치
        int end = 0;
        Arrays.sort(routes, (o1, o2) -> Integer.compare(o1[1], o2[1]));
        for (int i = 1; i < routes.length; i++) {
            answer++;
            if (routes[i][0] <= routes[i-1][1]) { //카메라 설치 필요x
                start = routes[i][0];  //겹치는 부분의 제일 첫 부분에 카메라 설치
                end = routes[i-1][1];
                i++;
                while(i < routes.length) {
                    if (routes[i][0] >= start && routes[i][0] <= end) {
                        i++;
                        start = routes[i][0];
                    }
                    else break;
                }
            }
        }
        return answer;
    }
}

처음에는 겹치는 부분을 생각하고, 그 사이에 다음 구간이 있는 경우 넘어가고 아닌 경우 answer을 플러스 해주는 방식으로 복잡하게 생각했다. 

그런데 생각보다 간단하게 풀 수 있었다.

1. routes를 각 구간의 진출점을 기준으로 정렬해준다.

2. min 값을 가장 작은 수로 설정한다.(구간의 시작점이 마이너스도 가능하므로 MIN_VALUE 사용해야 함.)

3-1. 그 다음 구간의 시작점이 min값보다 작으면 겹치는 것이므로 카메라를 추가해주지 않고 그 다음 구간의 시작점과 min 값을 비교한다. 

3-2. 만약 다음 구간(x 구간)의 시작점이 min값보다 크다면 겹치지 않는 것이므로 카메라를 추가해주고 min값을 x 구간의 진출점을 min값으로 설정해준다.

이 과정을 routes의 길이만큼 반복해주면 된다.

 

 

-정답 코드

import java.util.*;
class Solution {
    public int solution(int[][] routes) {
        int answer = 0;
        Arrays.sort(routes, (o1, o2) -> Integer.compare(o1[1], o2[1]));
        int min = Integer.MIN_VALUE;
        for (int[] route : routes) {
            if (min < route[0]) {   //안 겹치는 경우
                answer++;
                min = route[1];
            }
        }
        return answer;
    }
}