알고리즘/백준

BOJ) 회의실배정

Zin0_0 2020. 7. 11. 20:43
반응형

회의실배정

 

1931번: 회의실배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net

풀이

 

포스팅하기에는 조금 민망한 코드지만, 정답률이 높지 않아서 포스팅하게 됐다.

회의가 시작시간과 끝나는 시간이 담겨있는 여러 회의에 대해 요청받는다.

이 때, 고르게 분포해서 최대한 많은 팀이 회의를 할 수 있게 만들어야한다.

 

그래서 처음에는 회의 시간이 가장 짧은 순으로 정렬을 했었다.

하지만, 반례가 존재했고 다시 고민했다.

 

회의가 끝나는 시간을 기준으로 시작시간이 가장 빠른 순서로 정렬하기로 했다.

회의가 끝나는 시간이 빠른 회의들 중 가장 회의 시간이 짧은 회의들을 채택하는 방법이다.

이후, 정렬된 배열을 돌면서 앞선 회의의 끝나는 시간과 같거나 이후인 회의들의 갯수를 count하며 답을 구했다.

 

코드는 짧지만, 람다식을 이용하지 않았다면 3~4줄은 더 늘었을 것이다.

 

 

코드

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    private static class Meeting {
        int start, end;
        public Meeting(int start, int end) {
            this.start = start;
            this.end = end;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        Meeting[] applies = new Meeting[n];
        for(int i=0; i<n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            applies[i] = new Meeting(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
        }

        br.close();
        solution(n,applies);
    }

    private static void solution(int n, Meeting[] applies) {
        int prev =-1;
        int cnt =0;

        Arrays.sort(applies,(Meeting m1, Meeting m2) -> m1.end == m2.end ? Integer.compare(m1.start,m2.start) : Integer.compare(m1.end, m2.end));
        for(Meeting meeting : applies) {
            if(prev <= meeting.start) {
                prev = meeting.end;
                cnt++;
            }
        }
        System.out.println(cnt);
    }
}
반응형