-
프로그래머스 단속카메라(자바) - 그리디코딩테스트 2022. 4. 16. 14:27
문제 설명
고속도로를 이동하는 모든 차량이 고속도로를 이용하면서 단속용 카메라를 한 번은 만나도록 카메라를 설치하려고 합니다.
고속도로를 이동하는 차량의 경로 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 -틀린 코드
import java.util.*; class Solution { public int solution(int[][] routes) { int answer = 0; int start = 0; //현재 카메라 위치 int end = 0; Arrays.sort(routes, (o1, o2) -> Integer.compare(o1[1], o2[1])); for (int i = 1; i < routes.length; i++) { answer++; if (routes[i][0] <= routes[i-1][1]) { //카메라 설치 필요x start = routes[i][0]; //겹치는 부분의 제일 첫 부분에 카메라 설치 end = routes[i-1][1]; i++; while(i < routes.length) { if (routes[i][0] >= start && routes[i][0] <= end) { i++; start = routes[i][0]; } else break; } } } return answer; } }
처음에는 겹치는 부분을 생각하고, 그 사이에 다음 구간이 있는 경우 넘어가고 아닌 경우 answer을 플러스 해주는 방식으로 복잡하게 생각했다.
그런데 생각보다 간단하게 풀 수 있었다.
1. routes를 각 구간의 진출점을 기준으로 정렬해준다.
2. min 값을 가장 작은 수로 설정한다.(구간의 시작점이 마이너스도 가능하므로 MIN_VALUE 사용해야 함.)
3-1. 그 다음 구간의 시작점이 min값보다 작으면 겹치는 것이므로 카메라를 추가해주지 않고 그 다음 구간의 시작점과 min 값을 비교한다.
3-2. 만약 다음 구간(x 구간)의 시작점이 min값보다 크다면 겹치지 않는 것이므로 카메라를 추가해주고 min값을 x 구간의 진출점을 min값으로 설정해준다.
이 과정을 routes의 길이만큼 반복해주면 된다.
-정답 코드
import java.util.*; class Solution { public int solution(int[][] routes) { int answer = 0; Arrays.sort(routes, (o1, o2) -> Integer.compare(o1[1], o2[1])); int min = Integer.MIN_VALUE; for (int[] route : routes) { if (min < route[0]) { //안 겹치는 경우 answer++; min = route[1]; } } return answer; } }
'코딩테스트' 카테고리의 다른 글
프로그래머스 카펫(자바) - 완전탐색 (약수 구하기) (0) 2022.04.19 프로그래머스 소수찾기(자바) - 완전 탐색 * (0) 2022.04.18 프로그래머스 섬 연결하기(자바) - 그리디 / 크루스칼 알고리즘** (0) 2022.04.14 프로그래머스 큰 수 만들기(자바) - 탐욕법 Greedy (0) 2022.04.12 프로그래머스 조이스틱(탐욕법 Greedy) - 자바 ** (0) 2022.04.12