그리디. 회의실 배정

Jung In Lee·2023년 2월 1일
0

문제

한개의 회의실을 사용하고자 하는 N개의 회의가 있다. 회의할수있는 최대 팀의 개수를 구해라.

해결방향성

일단, 시간대를 모두 나열하면, 빨리시작하고 빨리 종료하는 것 위주로 선택되어야한다.
그중에서도 회의시간은 종료시간이 빠른순으로 나열하면 영향을 주지않으므로 종료시간에 초점을 맞추며, 종료시간이 같을때는 시작시간이 빠른순으로 나열한다.
그렇게 현재 회의실에 들어가는 팀을 저장하는 변수를 만들고, 그 변수의 끝나는 시간이 다음 시작하는 시간과 같거나 작아야 다음팀이 들어갈수있다. 그렇게 최대회의수를 카운트할수있다.
그리고 시간대 범위가 0이상 2의31승-1이하이므로, long범위로 변수를 저장해야한다.

코드

import java.io.*;
import java.util.*;

public class Main {
    static int N;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        N = Integer.parseInt(br.readLine());

        long[][] meeting = new long[N][2]; // [2] : 길이
        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            meeting[i][0] = Long.parseLong(st.nextToken());
            meeting[i][1] = Long.parseLong(st.nextToken());
        }

        Arrays.sort(meeting, new Comparator<long[]>() {
            @Override
            public int compare(long[] o1, long[] o2) {
                if (o1[1] == o2[1]) {
                    return (int) (o1[0] - o2[0]);
                }
                return (int) (o1[1] - o2[1]);
            }
        });
        int count = 1;
        long[] meet = meeting[0];
        for (int i = 1; i < N; i++) {
            if (meet[1] <= meeting[i][0]) {
                meet = meeting[i];
                count++;
            }
        }

        bw.write(String.valueOf(count));

        bw.flush();
        br.close();
        bw.close();
    }


}

결론

종료시간으로 나열하여 회의 running time 해결.
또한, long 범위로 설정. 정렬할때 변수값을 o1[0] - o1[0]으로 해줘서 처음에 오류났었음.
변수주의.

profile
Spring Backend Developer

0개의 댓글