막무가내로 삽질하는 알고리즘

MeetingRoom2

Jungsoomin :) 2020. 10. 18. 04:02
  • 회의의 시작과 끝이 주어짐
  • 총 회의에서 사용될 회의실 수를 리턴해라.
  • intervals 의 length 가 0 이 아닌이상 1개의 방은 무조건 있음
  • 이후 start, end를 비교해서 겹치면 방 추가함
public class MeetingRoom2 {
    public static void main(String[] args) {
        Interval interval1 = new Interval(0, 30);
        Interval interval2 = new Interval(5, 10);
        Interval interval3 = new Interval(15, 20);
        Interval interval4 = new Interval(7,10);
        Interval interval5 = new Interval(2, 4);
        Interval[] intervals = new Interval[]{interval1,interval2,interval3,interval4,interval5};

        int answer = solve(intervals);
        System.out.println(answer);
    }

    private static int solve(Interval[] intervals) {
        Arrays.sort(intervals, (o1,o2) -> o1.start - o2.start);
        int result = 1;
        for(int i=1; i<intervals.length; i++){
            if(intervals[i-1].end > intervals[i].start){
                result ++;
            }
        }
        return result;
    }


}

풀이법

 

우선순위 큐는 정말 중요하다고 한다. 사용해보는 연습을 해야겠다.

  • 우선순위 큐를 사용.
  • Start 를 기준으로 소팅
  • End 를 기준으로 다시 minHeap 에 넣어줌 즉 내림차순으로 우선순위 큐 구현
  • 큐에 값을 넣는다.
  • 다음 원소의 start 값이 end 보다 <= 라면 poll() 빼내고 원소 값을 넣는다. 왜..? size로 리턴할 것이므로
  • 사이즈를 리턴한다.
public class MeetingRoom2Teaching {
    public static void main(String[] args) {
    	Interval interval1 = new Interval(0, 30);
        Interval interval2 = new Interval(5, 10);
        Interval interval3 = new Interval(15, 20);
        Interval interval4 = new Interval(7,10);
        Interval interval5 = new Interval(2, 4);
        Interval[] intervals = new Interval[]{interval1,interval2,interval3,interval4,interval5};

        int answer = solve(intervals);
        System.out.println(answer);
    }

	private static int solve(Interval[] intervals) {
	if(intervals == null && intervals.length ==0) 
		return 0;
	
		Arrays.sort(intervals, (o1, o2) -> o1.start - o2.start);
		
		//사이즈와 우선순위를 정했다.
		Queue<Interval> minHeap = new PriorityQueue<Interval>(intervals.length, (o1, o2) -> o1.end - o2.end);
		int max = 0;
		
		for(int i=0; i<intervals.length; i++) {
			
			// 큐가 비었거나 , end 타임보다 start 타임이 크다면 방 1개로 커버 됨
			while(! minHeap.isEmpty() && minHeap.peek().end <= intervals[i].start) {
				minHeap.poll();// size로 비교할 것이므로 빼낸다.
			}
			
			minHeap.offer(intervals[i]);// 0 30 , 5 10
			max = Math.max(max, minHeap.size());
		}
		return max;
	}
}

'막무가내로 삽질하는 알고리즘' 카테고리의 다른 글

LicenseKeyFormatting  (0) 2020.10.18
JewelsAndStones  (0) 2020.10.18
우선순위 큐  (0) 2020.10.18
Merge Interval  (0) 2020.10.11
DailyTemperature  (0) 2020.10.11