알고리즘 문제풀이
[프로그래머스] 단속카메라 (C++)
SiO2whocode
2024. 11. 7. 15:21
728x90
탐욕알고리즘 (Greedy)
N개의 차량의 진입지점과 진출지점이 주어지면 모든 차량을 단속할 수 있는 단속카메라의 최소 설치 개수를 반환하는 문제
접근방법
진출지점을 기준으로 먼저 나가는 차가 앞에 오도록 차들을 정렬한 후에,
첫번째 차 부터 이 차가 나가는 지점에 단속카메라를 설치한다고 할 때, 차례로 차를 순회하며 현재 단속카메라가 단속할 수 있는 차량인지 확인한다.
= 반복문에서 가리키고 있는 차의 진입지점이 현재 단속카메라의 위치와 같거나 그 전에 위치하면,
해당차는 이미 단속할 수 있으므로 넘어가고,
만약, 이 차의 진입지점이 현재 단속카메라의 위치보다 이후에 위치한다면, 해당 카메라로는 단속할 수 없으므로 다시 이 차의 진출지점에 단속카메라를 설치하고, 단속카메라의 총 개수를 1 추가한다.
이렇게 반복문이 종료되면 마지막 차량 묶음을 감시할 수 있는 단속카메라의 개수는 카운트되지 않았으므로 1을 더해서 반환한다.
오답노트
처음에 정렬을 진입지점을 기준으로 정렬했었는데, 그러면 첫번째 차량이 진출하기 전에 다음 차량이 진출해버리는 경우는 고려하지 못하기 때문에 진출지점을 기준으로 정렬해야 했다.
소스코드
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(vector<int> a, vector<int> b){
if(a[1] == b[1]){
return a[0] < b[0];
}
return a[1] < b[1];
}
int solution(vector<vector<int>> routes) {
int answer = 0;
sort(routes.begin(), routes.end(), cmp);
int e = routes[0][1];
for(vector<int> route : routes){
if(route[0] > e){
e = route[1];
answer++;
}
}
return answer+1;
}
728x90