본문 바로가기

Algorithms/Programmers

[Java] Progrmmers 코딩테스트 연습 :단속카메라 (Greedy)

728x90

---문제----

 

문제 설명

고속도로를 이동하는 모든 차량이 고속도로를 이용하면서 단속용 카메라를 한 번은 만나도록 카메라를 설치하려고 합니다.

고속도로를 이동하는 차량의 경로 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 지점에 카메라를 설치하면 첫 번째, 세 번째 차량이 카메라를 만납니다.

 

---코드----

 

본 문제는, 주어진 routes 를 고속도로에서 나간 지점 (즉, routes[i][1]) 기준으로
오름차순으로 정렬한 후에
순차적으로 나간 지점과 시작 지점을 이용하여 문제를 풀면 됩니다.

정렬된 리스트에서 처음 차량의 나간 지점을 min 값에 저장을 시키고
다음 차량의 시작 지점과 min 값을 비교 하였을 때,
1 ) 현재 차량의 시작 지점이 더 크면 ? 카메라 추가 및 min 값에 현재 차량의 끝 지점을 저장
2 ) 더 작으면 ? 다음 번째 차량으로 넘어가기

로 진행을 하시면 됩니다.

 

이해하기 쉽게 그림으로 설명하겠습니다.

 

routes = [[-10,0], [-3,5], [-5,7], [9,11]] 가 있을 때,

STEP 1 ) 첫번째 차량에서 , min = 0 을 저장하고 카메라 갯수를 1로 저장
STEP 2 ) 두번째 차량에서. 현재 차량의 시작 지점이 min 값보다 큰지 확인 ( 0>-3 ) 이니까, 다음 차량으로 반복 ..

STEP 3 ) 반복 하다가, 네번째 차량에서 시작 지점이 min 값보다 크니까 ( 0<9 ), min 값에 11을 저장하고 카메라 1추가

와 같은 방식 입니다.

 

import java.util.Arrays;

class Solution {
    public int solution(int[][] routes) {
        // 끝나는 시간 순 대로 오름차순 정렬
		Arrays.sort(routes, (a,b)-> Integer.compare(a[1], b[1]));
		int cnt = 0;
		
		int min = Integer.MIN_VALUE;
		for(int[] route : routes) {
			if(min <  route[0] ) {
				// 전 거의 끝나는 시간 보다 시작 시간이 큰 경우
				// 안 겹치니까 변경하고, 숫자 더하기
				min = route[1];
				++cnt;
			}
		}
        return cnt;
    }
}

 

---출처---

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형