반응형
https://www.acmicpc.net/problem/1931
- 문제
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
- 입력
첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.
출력
첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.
1931 백준 회의실 자바 코드
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
ArrayList<MeetingRoom> meetingRooms = new ArrayList<MeetingRoom>();
for(int i=0; i<N; i++){
int x = sc.nextInt();
int y = sc.nextInt();
meetingRooms.add(new MeetingRoom(x,y)); //미팅룸 start, end 시간 추가합니다.
}
// 정렬을 합니다.
// 두 번째 인자로 Comparator 객체를 익명객체로 만들어서 넘깁니다.
Collections.sort(meetingRooms, new Comparator<MeetingRoom>() {
@Override
public int compare(MeetingRoom o1, MeetingRoom o2) {
if(o1.getEnd()> o2.getEnd()){
return 1;
}
else if(o1.getEnd()< o2.getEnd()){
return -1;
}
return o1.start - o2.start;
}
});
int startTime;
int endTime = -1;
int answer=0;
for(int i=0;i<meetingRooms.size();i++){
startTime = meetingRooms.get(i).start; //정렬 후 strat시간을 추출합니다.
if(startTime>=endTime){ //start시간 >= end시간이 같다면 카운트를 합니다.
endTime = meetingRooms.get(i).end;
answer++;
}
}
System.out.println(answer);
}
private static class MeetingRoom {
int start;
int end;
public MeetingRoom(int start, int end) {
this.start = start;
this.end = end;
}
public int getStart() {
return start;
}
public int getEnd() {
return end;
}
}
}
1931 백준 회의실 자바를 풀었지만 다른 방법으로 풀어봤습니다.
정리
- 입력받은 미팅룸시간을 배열로 저장합니다.
- 저장 후, 정렬합니다.
- 정렬 후 첫번째 배열부터 꺼내며 비교를 하여 카운트를 해줍니다.
감사합니다.
반응형
댓글