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

2019. 7. 2. 22:42알고리즘

 

알고리즘 연습 - 단속카메라 | 프로그래머스

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

programmers.co.kr

문제 설명

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

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

 

-

 

카메라는 무조건 한 대 이상 설치되기 때문에 answer의 초기값을 1로 셋팅해줬습니다. 그 다음, routes를 정렬했는데요. 아래와 같이 정렬하면, [[-20, 15], [-18, -13], [-14, 5], [-5, -3]] 이렇게, 앞에 있는 수 기준으로 정렬이 됩니다. 

 

여기서 그리디적으로 생각을 해줘야 하는데요. 먼저 출발한 차와 조금 더 늦게 출발한 차를 비교해가면서, 어디서 빠져나가는지, 여기서 빠져나가면 그 다음 차는 같은 단속 카메라를 사용할 수 있을지를 생각해야 합니다.

 

tmp는 현재 단속카메라의 범위라고 할 수 있겠습니다. routes[i][1]을 비교하면서 더 작은 값들을 저장하고 있습니다. 이 tmp 값보다 큰 값에서 다음 차가 출발한다면 이 범위 안에 있지 못하므로 단속 카메라의 갯수를 증가시켜줘야 합니다.

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<vector<int>> routes) {
    int answer = 1;
    
    sort(routes.begin(), routes.end());

    int tmp = routes[0][1];
    for (int i = 0; i < routes.size() - 1; i++) {
        if (tmp > routes[i][1]) tmp = routes[i][1];
        if (tmp < routes[i + 1][0]) {
            answer += 1;
            tmp = routes[i + 1][1];
        }
    }
    
    return answer;
}

'알고리즘' 카테고리의 다른 글

[백준] 1720번: 타일 코드  (0) 2019.07.12
[백준] 1328번: 고층 빌딩  (0) 2019.07.03
[백준] 2240번: 자두나무  (0) 2019.07.02
[백준] 2228번: 구간 나누기  (0) 2019.07.02
[백준] 11049번: 행렬 곱셈 순서  (0) 2019.07.02