백준 1931번 회의실 배정

이상민·2023년 11월 28일
0

알고리즘

목록 보기
109/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class ArrangeConferenceRoom {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int[][] arr = new int[N][2];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] x, int[] y) {
                if(x[1]==y[1]){
                    return Integer.compare(x[0],y[0]);
                }
                return Integer.compare(x[1],y[1]);
            }
        });

        int count = 1;
        int end = arr[0][1];
        for (int i = 1; i < N; i++) {
            if(arr[i][0]>=end){
                count++;
                end = arr[i][1];

            }
        }
        System.out.println(count);
    }
}

풀이방법

📢이 문제의 핵심은 종료시점을 기준으로 정렬한 후, 가장 위에 있는 회의부터 고르면 된다는 것이다.
단, 이때 종료시점이 같다면, 시작시점이 빠른것을 먼저 선택해야한다.

후기

알고나면 아무것도 아닌 규칙이지만, 알기전에는 잘 안보였던 규칙이었다.
규칙만 안다면 구현은 크게 어렵지 않은 문제였는데, 특정 조건에 따라 정렬을 한번더 해줘야한다.
기존에 나는 정렬을 2번해서 해결했는데, 해당 코드처럼 if문으로 같을때만 따로 빼서 정렬하는 코드가 더 좋다고 생각하여 가져왔다.
앞으로 비슷한 조건이 나올땐, 정렬을 2번하지 않고, 저런식으로 풀어야겠다.

profile
개린이

0개의 댓글