[JS/알고리즘] 탐욕 : 단속카메라 (프로그래머스)

2021. 12. 12. 14:29·Programming/Algorithm

문제 설명

 

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

고속도로를 이동하는 차량의 경로 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
'Programming/Algorithm' 카테고리의 다른 글
  • [JS/알고리즘] DP : N으로 표현 (프로그래머스)
  • [JS/알고리즘] 탐욕 : 섬 연결하기 (프로그래머스)
  • [JS/알고리즘] 탐욕 : 구명보트 (프로그래머스)
  • [Python] 수들의 합 : two pointer
박유상의 개발블로그
박유상의 개발블로그
개발블로그
  • 박유상의 개발블로그
    박유상의 개발블로그
    박유상의 개발블로그
  • 전체
    오늘
    어제
    • 전체 (134)
      • Who am I (10)
        • Portfolio (4)
        • Reminiscence (5)
        • Oversea (1)
        • SiliconValley (0)
      • React (36)
        • React Basic (15)
        • React Tech (5)
        • JavaScript (7)
        • TypeScript (3)
        • CSS&HTML (3)
        • Firebase (3)
      • NodeJS (1)
        • NodeJS Basic (1)
      • Flutter (55)
        • Flutter Widget Design (5)
        • Flutter Widget Basic (8)
        • Flutter Tech (18)
        • Flutter Issue (7)
        • Flutter Web (6)
        • About Flutter (2)
        • Firebase (1)
        • Dev Env (1)
        • Dart (7)
      • Programming (31)
        • Web (1)
        • General (0)
        • Algorithm (25)
        • Python (1)
        • VS Code (2)
      • Django (0)
  • 블로그 메뉴

    • Who I AM
    • React
    • NodeJS
    • Flutter
    • Programming
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    react
    Firebase
    링고리
    DP
    DART
    useTranslation
    Flutter
    HTML
    플러터 웹
    JavaScript
    리액트
    CSS
    TypeScript
    자바스크립트
    파이썬
    포트폴리오
    JSON
    useState
    프로그래머스
    useRef
    github
    Lingory
    flutter web
    알고리즘
    Redux
    탐욕법
    플러터
    map
    웹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
박유상의 개발블로그
[JS/알고리즘] 탐욕 : 단속카메라 (프로그래머스)
상단으로

티스토리툴바