본문 바로가기
Algorithm/프로그래머스

[Level 3] 단속 카메라

by woohyeon 2021. 9. 21.
반응형

 

겹치지 않는 범위는 어쩔 수 없이 카메라를 1대 주고, 겹치는 영역은 최대한 겹치도록 하면 된다.

비교를 위해 먼저 시작 지점을 기준으로 오름차순 정렬한다.

그다음 반복하면서 [i]와 [i+1]의 범위를 비교하여 [i+1]의 시작 지점이 [i]의 종료 지점보다 크면 겹치지 않는 것이므로 어쩔 수 없이 카메라 1대를 주고 넘어간다.

만약 [i+1]의 시작 지점이 [i]의 종료 지점보다 작거나 같다면 1칸이라도 겹치는 것이므로 새로운 영역의 시작 지점을 [i+1]의 시작 지점으로 업데이트한다. 종료 지점은 더 작은 지점으로 업데이트한다. 다음엔 이 새로운 영역과 비교해서 겹친다면 영역을 또 업데이트하던지, 겹치지 않는다면 현재까지의 영역에 카메라를 한 대주고, 다시 반복하면 된다.

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<vector<int>> routes) {
    
    // 시작 지점이 작은 순서대로 정렬
    sort(routes.begin(), routes.end(), [](const vector<int>& v1, const vector<int>& v2){
       return v1[0] < v2[0]; 
    });
    
    int curS = -1;
    int curE = -1;
    int answer = 0;
    for(int i = 0; i < routes.size(); ++i)
    {
        if(i + 1 == routes.size())
        {
            ++answer;
            break;
        }
        
        int s = (curS == -1) ? routes[i][0] : curS;
        int e = (curE == -1) ? routes[i][1] : curE;
        int nextS = routes[i+1][0];
        int nextE = routes[i+1][1];
        
        if(nextS <= e)
        {
            curS = nextS;
            curE = (e > nextE) ? nextE : e;
        }
        else
        {
            ++answer;
            curS = -1;
            curE = -1;
        }
    }
    
    return answer;
}

'Algorithm > 프로그래머스' 카테고리의 다른 글

[연습문제] 최고의 집합  (0) 2021.09.24
[Level 3] 섬 연결하기  (0) 2021.09.21
[Level 2] 큰 수 만들기  (0) 2021.09.20
[Level 2] 점프와 순간이동 | C++  (0) 2020.09.23
[Level 2] 위장 - 해시 | C++  (0) 2020.05.28



댓글