hyowonii의 블로그

[프로그래머스42884][C++] 단속카메라 본문

알고리즘 문제풀이(C++)

[프로그래머스42884][C++] 단속카메라

hyowonii 2022. 6. 9. 22:38

https://programmers.co.kr/learn/courses/30/lessons/42884

 

코딩테스트 연습 - 단속카메라

[[-20,-15], [-14,-5], [-18,-13], [-5,-3]] 2

programmers.co.kr

 

문제

 

해결

사실 프로그래머스는 문제 풀이 유형이 사전에 다 보여서,, 그리디를 활용하여 어떻게 푸는지만 생각하면 된다.

그런데 그리디는 왜이리도 익숙해지지 않는지ㅠㅠ 어려운 유형은 아닌 것 같으면서도 막상 풀려고 하면 못풀겠는 그런,,

 

우선 내가 해결한 방식도 어렵진 않기 때문에 코드부터 보자.

🧨미리 말하자면, 필요없이 길어 그리 좋은 코드는 아닌듯싶다. 밑에 더 간단하고 좋은 코드도 첨부함!

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

using namespace std;

int solution(vector<vector<int>> routes) {
    int answer = 0;

    sort(routes.begin(), routes.end()); // *정렬*

    bool checked[10005] = { 0 };

    for (int i = 0; i < routes.size(); i++) {
        if (checked[i] == true) continue;
        int cura = routes[i][0];
        int curb = routes[i][1];
        for (int j = i + 1; j < routes.size(); j++) {
            if (checked[j] == true) continue;
            int newa = routes[j][0];
            int newb = routes[j][1];
            if ((cura <= newa && newa <= curb) || (cura <= newb && newb <= curb)) {   // 범위 겹치면
                cura = max(cura, newa);
                curb = min(curb, newb);
                checked[i] = true;
                checked[j] = true;
            }
        }
        checked[i] = true;
        answer++;
    }

    return answer;
}

routes의 차를 하나씩 돌면서 이후에 들어오는 차들과 하나씩 비교하며 그 두 개의 차 사이에 겹치는 부분이 있으면 해당하는 차들은 카메라에 찍혔다고 체크하고(checked = ture) 카메라 값을 하나 증가시킨다.

여기서, 처음에 정렬을 안하고 실행시켰더니 다 실패했다. (사실 정확한 이유는 모르겠지만 대충 생각해보면 꼬여서 오류가 날 것 같긴하다..) 아무튼 정렬하면 깔끔하게 순서대로 접근하기 쉽기 때문에 정렬을 하자.

 

내가 생각한 방법은 checked를 활용하는 방법이었는데, 이럴 필요없이 너무 깔끔한 풀이를 찾아서 이것도 공유하고자 한다.

 

// 더 간단한 풀이

int solution2(vector<vector<int>> routes) {
    //기본 카메라 1대
    int answer = 1;
    //들어온 리스트 정렬
    sort(routes.begin(), routes.end());
    //비교를 위해 처음차가 나가는 부분 체크
    int temp = routes[0][1];
    //리스트 순회하기
    for (auto a : routes) {
        //현재 차가 나가는 부분보다 뒤에 차가 들어온다면
        if (temp < a[0]) {
            //카메라 설치
            answer++;
            //나가는 부분 정정
            temp = a[1];
        }
        //현재 차보다 뒤차가 먼저나가면 
        if (temp >= a[1])    temp = a[1];// 나가는 부분을 뒷차로 수정
    }
    return answer;
}

[코드 출처] https://mungto.tistory.com/49

🎈순서대로 정렬한 후 뒷 차가 들어오는 시간이 앞 차가 나가는 시간보다 앞서면 겹치는 것이고, 뒷 차가 들어오는 시간이 앞 차가 나가는 시간 이후이면 겹치지 않는 것이다. 코드가 매우 간단하고 깔끔하다! 나는 더 연습해야겠다,,