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 |