
모든 차량이 최소 한 번은 단속카메라를 만나도록 하려면 최소 몇 대가 필요한지 구하는 문제다. 구간(Interval) 문제의 핵심은 정렬이다. 보통 '끝나는 지점'을 기준으로 정렬하지만, 발상을 전환하여 '시작 지점'을 기준으로 내림차순 정렬하면 코드가 훨씬 간결해진다.
sort는 기본적으로 첫 번째 원소(진입 지점)를 기준으로 정렬하므로, 비교 함수(cmp)를 따로 짜야 하는 번거로움이 있었다.routes를 진입 지점 기준 내림차순으로 정렬한다. (sort + rbegin)camera)가 이 차의 진출 지점보다 더 뒤에 있다면? (즉, 이 차가 카메라보다 먼저 나가버려서 안 찍힌다면)#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> routes) {
int answer = 0;
// sort(첫번째 원소)를 이용해 내림차순 정렬
sort(routes.rbegin(), routes.rend());
// 범위 밖의 값으로 초기화
int camera = 30001;
// 뒤에서부터 탐색하며 카메라 설치
// 차량의 진출 지점이 카메라 위치보다 작으면 -> 진입 지점에 카메라 설치
for (const auto& route : routes) {
if (route[1] < camera) {
camera = route[0];
answer++;
}
}
return answer;
}
cmp 함수를 만들어야 해서 코드가 길어진다.vector의 기본 정렬 순서를 그대로 이용할 수 있어 코드가 매우 짧아진다. 논리적으로는 "진출 기준 오름차순"과 동치다.| 항목 | 내용 |
|---|---|
| 유형 | Greedy (탐욕법), 스위핑(Sweeping) |
| 체감 난이도 | 중 (정렬 기준 잡기가 핵심) |
| 복잡도 | 시간: (정렬), 공간: |
| 새로 배운 것 | 문제의 기준을 뒤집어서(내림차순) 생각하면 구현이 훨씬 쉬워질 수 있다. |