공부기록

단속카메라 본문

코테/프로그래머스

단속카메라

코타쿠 2021. 9. 5. 12:39

문제

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

코드

import java.util.*;

class Solution {

    class Node implements Comparable<Node>{
        int s;
        int e;

        public Node(int s, int e){
            this.s = s;
            this.e = e;
        }

        public int compareTo(Node obj){
            if(this.s < obj.s)
                return -1;
            else if(this.s > obj.s)
                return 1;
            else 
                return 0;
        }

    }

    public int solution(int[][] routes) {
        int answer = 0;
        PriorityQueue<Node> pq = new PriorityQueue<>();
        for(int[] route : routes){
            pq.add(new Node(route[0], route[1]));
        }

        Node cur_node = pq.poll();
        int threshold = cur_node.e;

        while(!pq.isEmpty()){
            cur_node = pq.poll();
            if(cur_node.s > threshold){
                threshold = cur_node.e;
                answer++;
            }else
                threshold = Math.min(threshold, cur_node.e);
        }

        answer++;

        return answer;
    }
}

피드백

  • 나의 아이디어는 다음과 같다.
    • 진입시간 순으로 정렬을 한 뒤, 각 원소의 진출시간을 좁혀 더 이상 이 후의 원소를 현 그룹에 넣을 수 없을 때, 그룹을 나눈다.
  • 왜 이 아이디어가 정답일까?
    • 생각해보면, 결국 그룹을 나누는 기준은 현 그룹 중 제일 빠른 진출 시간을 가지는 원소이다.
    • 즉 각 그룹의 기준 원소는, 서로 만나지 못하는 원소들이다.
    • 이 기준 원소의 갯수를 최소화 하도록 그룹을 나누는 것이, 이 문제의 최적해를 찾아가는 기본 방법이라고 할 수 있다.
    • 따라서 최대한 원소를 많이 중첩시키면서 그 임계값을 좁혀나가는 방법이 답이었다고 생각해 볼 수 있다.

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

순위  (0) 2021.09.06
입국심사  (0) 2021.09.06
섬 연결하기  (0) 2021.09.05
여행경로  (0) 2021.09.04
이중우선순위큐  (0) 2021.09.03