[프로그래머스 / Greedy(L.v3)] 단속카메라 - 파이썬

Seung Hyeon ·2023년 6월 26일
0

알고리즘

목록 보기
8/10
post-thumbnail

문제 설명

고속도로를 이동하는 모든 차량이 고속도로를 이용하면서 단속용 카메라를 한 번은 만나도록 카메라를 설치하려고 합니다.
고속도로를 이동하는 차량의 경로 routes가 매개변수로 주어질 때, 모든 차량이 한 번은 단속용 카메라를 만나도록 하려면 최소 몇 대의 카메라를 설치해야 하는지를 return 하도록 solution 함수를 완성하세요.

제한 조건

  • 차량의 수는 1대 이상 10,000대 이하입니다.
  • routes에는 차량의 이동 경로가 포함되어 있으며 routes[i][0]에는 i+1번째 차량이 고속도로에 진입한 지점, routes[i][1]에는 i번째 차량이 고속도로에서 나간 지점이 적혀 있습니다.
  • 차량의 진입/진출 지점에 카메라가 설치되어 있어도 카메라를 만난것으로 간주합니다.
  • 차량의 진입 지점, 진출 지점은 -30,000 이상 30,000 이하입니다.

입출력 예시

문제 접근

  • 핵심: 카메라를 어디 위치에 둘 것인가?
    → 차량의 경로 구간이 많이 겹치는 지점에 카메라를 설치하자

  • 3가지의 경우의 수

    • 겹치는 부분이 전혀 없을 경우: 아무 곳이나 설치

    • 한 경로가 다른 경로를 완전히 포함할 경우: 경로가 더 짧은 쪽의 진출 지점

    • 완전히 포함하지는 않으나 겹치는 구간이 존재할 경우: 겹치는 구간 쪽의 진출 지점

    ✅ 3가지의 경우를 모두 만족시키는 위치는 경로의 진출지점이다. → 카메라 위치는 진출지점이 적당

  1. 진출지점을 기준으로 가장 최소인 지점부터 정렬한다.
    • 예시: [[-20, -15], [-18, -13], [-14, -5], [-5, -3]]
  2. 카메라 위치 지점의 시작을 -30001로 잡는다.
  3. 각 루트를 돌면서, 카메라 위치 지점과 차량 루트 진입 지점을 비교한다
    3-1. 카메라 위치가 진입지점보다 작으면, 카메라와 차량이 만나지 못했다는 의미
    3-2. 카메라 위치가 진입지점보다 크거나 같으면, 이미 카메라와 차량이 만났다는 의미

코드

def solution(routes):
    answer = 0    # answer: 필요한 카메라 개수
    # 진출이 낮은 순으로 정렬
    routes.sort(key = lambda x: (x[1], x[0]))
    camera = -30001   # 최소 카메라 위치 지점
    
    for r0, r1 in routes:
        if camera < r0:
            answer += 1    
            camera = r1   # 가장 최근 카메라의 위치를 갱신 
        else:   # camera >= r0
            pass
    
    return answer
profile
안되어도 될 때까지

0개의 댓글