본문 바로가기
코딩테스트

[그리디] 백준 11000번 강의실 배정

by Enhydra lutris 2022. 9. 26.

2차원 배열 정렬하는법

1. Comparator

Arrays.sort(arr, (o1, o2) -> {
            if (o1[0] == o2[0])
                return o1[1] - o2[1];
            else 
                return o1[0] - o2[0];
        });

o1[0] - o2[1] 부분을 Integer.compare(o1[1], o2[1])로 바꿔도 된다.

 

한가지 기준으로만 정렬할 경우 아래와 같이 쓸수도 있다.

 Arrays.sort(arr, Comparator.comparing(o1->o1[1]));

1번째 element를 기준으로 정렬한다는 의미

 

2. 람다식

Arrays.sort(arr, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]);

아래의 강의실 배정 코드에서는 람다식을 사용함 Comparator을 넣어도 결과는 동일

강의실 배정 코드

 

import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

public class No11000{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[][] arr = new int[N][2];
        
        for(int i=0; i<N; i++){
            arr[i][0] = sc.nextInt();
            arr[i][1] = sc.nextInt();
        }
        
        //시작시간 순서대로 정렬
        Arrays.sort(arr, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]);
        
        PriorityQueue<Integer> q = new PriorityQueue<>();
        for (int i=0; i<N; i++){
            if(!q.isEmpty() && q.peek() <= arr[i][0]) {
				q.poll();
			}
            q.add(arr[i][1]);
        }
        System.out.println(q.size());
    }
}

 

큐에 들어갈 강의의 시작시간이 이미 큐에 있던 강의의 끝나는 시간과 같거나 늦다면 기존 강의실을 이용한다.

(기존 강의를 poll하고 새로운 강의를 add 하면 된다.)

댓글