[프로그래머스] 단속카메라

1 분 소요

단속카메라

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

고속도로를 이동하는 차량의 경로 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 지점에 카메라를 설치하면 첫 번째, 세 번째 차량이 카메라를 만납니다.

접근방법

이 문제를 처음 봤을 때 느낀건 아 고속도로를 빠져나가는 위치나 고속도로 들어가는 위치에 조작을 하면 문제 쉽게 풀 수 있겠구나 라는 생각이 들었다.

실제로 문제를 풀어보고 나니까 간단한 조작만 하면 쉽게 풀 수 있는 문제였다. 다른 분이 먼저 풀었던 블로그에서 그림을 간단히 참조하자면

다음과 같은 상황일 때,

routes                              return
[[-10,0], [-3,5], [-5,7], [9,11]]   2

image

자동차가 고속도로를 빠져나간 지점기준으로 오름차순으로 정리한 다음에 자동차가 빠져나간 지점보다 다른 자동차가 들어온 시점이 앞에 있는 지점이면 넘어간다.

하지만 그렇지 않을 경우 기준을 새로 들어온 자동차의 고속도로 나간 지점으로 재지정을 한 후 다시 찾는 것을 반복해나가는 과정을 진행하면 된다.

    import java.util.*;
    class Solution {
        public int solution(int[][] routes) {
            int answer = 1;
            ArrayList<Node> list = new ArrayList<>();
            
            for(int i=0; i<routes.length; i++)
            {
                list.add(new Node(routes[i][0],routes[i][1]));
            }
            
            Collections.sort(list); // 오름차순으로 정렬
            int min=list.get(0).end; // 기준은 맨 처음 자동차의 빠져나간 지점
            
            for(Node a : list){
                if(a.start>min){ //만약 새로들어온 자동차가 기준보다 더 늦은 지점에 있다면
                    min=a.end; //기준을 새로들어온 자동차의 빠져나간 지점으로 재설정
                    answer++; // 단속카메라 설치
                }
            }
            
            return answer;
        }
        
        
        
        class Node implements Comparable<Node>{
            int start;
            int end;
            
            Node(int start, int end){
                this.start = start;
                this.end = end;
            }
            @Override
            public int compareTo(Node o){
                return this.end-o.end;
            }
        } // 오름차순 정리
    }

카테고리:

업데이트: