알고리즘 문제풀이/자바

[백준-그리디] 1931: 회의실 배정 JAVA 자바

Ella_K 2022. 11. 18. 06:06

https://www.acmicpc.net/problem/1931

 

1931번: 회의실 배정

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

www.acmicpc.net

 

 

👉 '활동 선택 문제(Activity Selection problem)

  • 시간표를 최대한 많이 배정하거나 선택하는 문제
  • 한 사람이 하나의 활동에 대해서만 작업할 수 있을 때 최대한 많은 활동을 할 수 있는 수를 선택하는 문제
    • '한 사람이 하나의 활동에 대해서만 작업할 수 있다.'
    • 하나의 활동을 완료하기 전까지는 다른 활동을 선택할 수 없다.
    • 하나의 활동을 선택하면 나머지 겹치지 않는 활동에 대해서 독립적이고, 탐욕 선택 이후의 결과에 영향을 미치지 않는다.

👉 풀이

  • '이전 선택의 종료 시간' 과 '이후 선택의 시작 시간'이 서로 겹치지 않은면 된다.
  • 서로 겹치지 않는 활동에 대해 종료시간이 빠르면 더 많은 활동을 선택할 수 있는 시간이 많아진다.
  • 종료시간을 기준으로 정렬한 후, 이전 종료 시간에 대해 겹치는 것들을 제외하면서 순서대로 회의를 선택한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
import java.util.StringTokenizer;

// 서로 겹치지 않는 활동에 대해 종료시간이 빠르면 더 많은 활동을 선택할 수 있는 시간이 많아진다
public class p1931 {
    public static void main(String[] args) throws IOException {
        /*
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] times = new int[n][2];
        for(int i = 0; i < n; i++){
            times[i][0] = sc.nextInt();
            times[i][1] = sc.nextInt();
        }
        */
        // 입력은 Scanner 보다 BufferedReader가 더 빠르다.
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[][] times = new int[n][2];
        StringTokenizer st;
        for(int i = 0; i < n; i++){
            st = new StringTokenizer(br.readLine(), " ");
            times[i][0] = Integer.parseInt(st.nextToken());
            times[i][1] = Integer.parseInt(st.nextToken());
        }

        // 종료시점을 기준으로 오름차순 정렬
        /*
        주의 : 종료시점이 같을 경우 시작시점 기준으로 오름차순 정렬
        ex. 다음과 같은 상황이 생기면 안됨
        1 3
        8 8
        4 8*/
        Arrays.sort(times, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[1] == o2[1]) return o1[0] - o2[0];
                else return o1[1] - o2[1];
            }
        });

        int result = 1;
        int curEndTime = times[0][1];
        for(int i = 1; i < n; i++){
            if(times[i][0] >= curEndTime){
                result += 1;
                curEndTime = times[i][1];
            }
        }

        System.out.println(result);
    }
}

 

 


Source

https://st-lab.tistory.com/145

 

[백준] 1931번 : 회의실배정 - JAVA [자바]

www.acmicpc.net/problem/1931 1931번: 회의실배정 (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다. www.acmicpc.net 문제 그리디 알고리즘의 대표적인 문제 중 하나다. 알고리즘 [접근 방법] 위와 같이 시간표를 최대

st-lab.tistory.com