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
'알고리즘 문제풀이 > 자바' 카테고리의 다른 글
[프로그래머스-그리디] 구명보트 JAVA 자바 (0) | 2022.11.21 |
---|---|
[백준-그리디] 13305: 주유소 JAVA 자바 (0) | 2022.11.19 |
[백준-그리디] 11399: ATM JAVA 자바 (0) | 2022.11.19 |
[백준 - 그리디] 1541: 잃어번린 괄호 JAVA 자바 (0) | 2022.11.19 |
[백준-그리디] 11047번: 동전0 (0) | 2022.11.18 |