코딩테스트(연습)
22.06.22_회의식_배정_1931번_백준_그리디
양빵빵
2022. 6. 22. 11:14
package codingPraactice;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Scanner;
// 백준 1931
/*
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
<-----> => 1회
<--->
<----------->
<---> => 2회
<--------->
<------>
<------->
<------> => 3회
<--------->
<------------------------>
<-------> => 4회
주의 ) 2, 2 일 경우 시작하자마자 끝나는 회의이므로 횟수에 추가할 수 있다.
다만 1, 2가 있을 경우 실제로 2개의 회의가 겹치지 않을 수 있지만
로직상 1, 2보다 2, 2가 먼저 등장한 경우 나중에 나온 1, 2가 카운팅되지 않는다.
따라서 종료시간이 같은 경우 시작시간을 먼저 배치하도록 정렬해야 한다.
> 2차원 배열 정렬
*/
public class 그리디_알고리즘_회의실_배정_1931 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
List<List<Integer>> A = new ArrayList<>();
// 2차원 리스트에 데이터 입력받기
for (int i = 0; i < N; i++) {
A.add(new ArrayList<>());
A.get(i).add(sc.nextInt());
A.get(i).add(sc.nextInt());
}
sc.close();
// 정렬
A.sort((o1, o2) -> {
if (o1.get(1) == o2.get(1)) { // 종료 시간이 같으면
return o1.get(0) - o2.get(0); // 시작 시간으로 정렬
}
return o1.get(1) - o2.get(1); // 종료시간으로 정렬
});
int count = 0; // 회의 횟수
int end = -1; // 종료시간 저장
for (int i = 0; i < N; i++) {
if (A.get(i).get(0) >= end) { // 시작시간이 기존 종료시간보다 크거나같으면
end = A.get(i).get(1); // 종료시간을 갱신
count++;
}
}
System.out.println(count);
}
/*
public static void main(String[] args) {
// 2차원 배열 정렬
// 1. 2차원 배열 리스트 A 만들기
List<List<Integer>> A = new ArrayList<>();
A.add(new ArrayList<Integer>(Arrays.asList(3, 5)));
A.add(new ArrayList<Integer>(Arrays.asList(1, 5)));
A.add(new ArrayList<Integer>(Arrays.asList(0, 6)));
A.add(new ArrayList<Integer>(Arrays.asList(12, 14)));
A.add(new ArrayList<Integer>(Arrays.asList(5, 7)));
A.add(new ArrayList<Integer>(Arrays.asList(6, 10)));
A.add(new ArrayList<Integer>(Arrays.asList(3, 8)));
A.add(new ArrayList<Integer>(Arrays.asList(1, 4)));
A.add(new ArrayList<Integer>(Arrays.asList(2, 13)));
A.add(new ArrayList<Integer>(Arrays.asList(5, 9)));
A.add(new ArrayList<Integer>(Arrays.asList(8, 12)));
// 2. A를 오름차 정렬 (1순위 종료시간, 2순위 시작시간)
A.sort((nList1, nList2) -> {
if (nList1.get(1) == nList2.get(1)){ // 종료시간(get(1)) 같을 경우에는
return nList1.get(0) - nList2.get(0); // 시작시간(get(0)) 기준 오름차 정렬
}
return nList1.get(1) - nList2.get(1); // 종료시간
});
// A 데이터 확인
for (List<Integer> a : A) {
System.out.println(a);
}
*/
}