문제 설명
고속도로를 이동하는 모든 차량이 고속도로를 이용하면서 단속용 카메라를 한 번은 만나도록 카메라를 설치하려고 합니다.
고속도로를 이동하는 차량의 경로 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 지점에 카메라를 설치하면 첫 번째, 세 번째 차량이 카메라를 만납니다.
문제 풀이 방법
탐욕법 풀이의 핵심은 최적의 해를 찾기 위한 조건을 찾는게 아닌가 싶다.
그리고, BFS 처럼 여러 방향으로 진행하는 것이 아니라 조건을 가지고 한 방향으로만 순차적으로 진행되어야 한다.
해당 문제에서는 카메라가 차량이 나가는 지점에 설치 되는 것이 핵심 조건이고
이를 위해 차량이 나가는 순서대로 정렬되어야한다. 들어오는 순서대로 정렬할 수 도 있지만 이 경우 약간은 복잡한 연산이 필요하게 된다.
나가는 지점에 카메라가 설치 되기에 나가는 순서대로 정렬하자.
그러면 앞 전 차량이 나가기 전 현재 차량이 진입 한 경우 카메라의 위치가 겹치게 되며 이 때는 카메라를 설치할 필요가 없어진다.
반대로 앞 전 차량이 나간 후 현재 차량이 진입한 경우 현재 차량에 대한 카메라가 별도로 필요한 것이다.
정답 코드
//진입 시점을 기준으로 정렬
//차량이 나가는 지점에 카메라를 설치
//다음 차량이 이전 카메라의 영역에 해당하는지 검사
function solution(routes) {
let answer = 0;
let preCamera = -30001;
routes.sort(function(a,b){
return a[1]-b[1];
});
routes.map((e)=>{
if(e[0] > preCamera ){
answer ++;
preCamera = e[1];
}
})
return answer;
}
탐욕법의 문제로 의심된다면 항상 조건을 먼저 세워보자.
BFS로 착각해 문제를 풀 수도 있겠지만 연산의 순서가 정해져있다는 것을 고려해 탐욕 유형임을 의심해보자.
'Programming > Algorithm' 카테고리의 다른 글
[JS/알고리즘] DP : N으로 표현 (프로그래머스) (0) | 2021.12.14 |
---|---|
[JS/알고리즘] 탐욕 : 섬 연결하기 (프로그래머스) (0) | 2021.12.12 |
[JS/알고리즘] 탐욕 : 구명보트 (프로그래머스) (0) | 2021.12.05 |
[Python] 수들의 합 : two pointer (2) | 2021.09.03 |
[백준] 1003 피보나치 함수 (0) | 2021.08.14 |