[문제 요약]
특정 구간을 지나는 모든 차량이 단속용 카메라를 만다록 하는 문제다.
이전에 풀었던, 요격 시스템이라는 문제와 매우 비슷하다.
[프로그래머스/Python] 요격 시스템
HTML 삽입 미리보기할 수 없는 소스 [문제 설명] A나라가 B나라를 침공했다. 요격 시스템이 있지만 비용이 있어서 요격 횟수를 최소로 해야하기 때문에 미사일의 요격을 최소로 하는 횟수를 구
codingjj.tistory.com
풀이
이 문제는 greedy 하게 풀 수 있다. 특정 구간을 지나서 무조건 새로 카메라를 달아야 하는 구간이 오면 새로 비교하던 데이터들을 갱신하고, 다시 카메라가 차량들을 단속할 수 있는지 판단하면 된다.
이전에는 시작점을 기준으로 정렬을 해서 풀었는데, 마지막 점을 기준으로 풀 수도 있어서 방법을 바꿔 끝점을 기준으로 문제를 풀어보려고 한다.
끝 점을 기준으로 정렬을 하면 정렬된 수들은 시작점이 현재 끝점보다 작으면 같은 구간에서 지울 수 있다.
왜냐하면 이전에 저장된 끝점의 범위는 정렬이 되어있으므로 다음에 for문에서 나올 차량의 구간보다 무조건 끝점의 범위가 작기 때문이다.
그래서 시작점의 위치가 현재 저장된 끝점보다 작으면 하나의 카메라로 차량의 단속이 가능하다는 뜻이다.
[아이디어 정리]
- 차량의 경로를 경로의 끝점을 기준으로 정렬한다.
- 현재 저장된 끝점의 변수보다 시작점의 변수가 작으면 현재 카메라로 단속이 가능하므로 pass한다.
- 만약 현재 저장된 끝점의 변수보다 시작점의 변수가 크면, 새로 카메라를 달아야 하므로 끝점을 갱신하고 카메라 수를 1개 올린다.
- 총 카메라 수를 return하면 된다.
Code
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(vector<int> a, vector<int>b)
{
return a[1]<b[1];
}
int solution(vector<vector<int>> routes) {
int answer = 0;
sort(routes.begin(), routes.end(),compare);
int nowFinalRoute=-30001;
for (int i=0; i<routes.size(); i++)
{
if (nowFinalRoute<routes[i][0])
{
answer++;
nowFinalRoute=routes[i][1];
}
}
return answer;
}
끝점을 기준으로 하면 조건이 약간 줄어들게 된다
이전에 푼 문제랑 완전 똑같은 문제라 쉽네...
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
반응형
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C++] 아이템 줍기 (0) | 2024.01.11 |
---|---|
[프로그래머스/C++] 섬 연결하기 (0) | 2024.01.09 |
[프로그래머스/C++] 네트워크 (0) | 2024.01.07 |
[프로그래머스/C++] 자동완성 (0) | 2024.01.07 |
[프로그래머스/C++] 거스름돈 (1) | 2024.01.07 |