Java

Coding - Meeting Room

kakaroo 2022. 2. 1. 11:18
반응형

Language: Java(자바)

article logo

 

 

Java(자바)로 구현한 회의실 예약

회사에는 N개의 회의실이 있다. 수많은 팀이 모여 토론하고 업무를 처리하기 위해서는 회의실이 필수적이다.
내부망에 아주 간단한 회의실 예약 시스템이 있지만 편의성이 매우 떨어진다. 단순히 예약된 회의의 목록만 표시되기 때문에, 방 별로 비어 있는 시간이 언제인지를 확인하기가 힘든 것이다. 당신은 이를 직접 해결해 보기로 마음 먹었다.

회의실 이용 규칙은 다음과 같다:
회의실은 9시부터 18시까지만 사용 가능하다. 모든 회의의 시간은 이 안에 완전히 포함되어야 한다. 
회의는 정확히 한 회의실을 연속한 일정 시간 동안만 점유한다. 즉 각 회의는 (회의실, 시작 시각, 종료 시각)의 정보로 나타낼 수 있다. 
회의의 시작과 종료 시각은 시(時, hour) 단위로만 설정 가능하다. 같은 회의실을 사용하는 회의 시간은 서로 겹칠 수 없다. 여기서 겹친다는 것은, 두 회의 모두에 포함되는 시간이 1시간 이상 존재한다는 것을 의미한다. 
예를 들어, 10시-12시의 회의와 11시-13시의 회의는 겹치는데, 11시-12시의 시간이 두 회의 모두에 포함되기 때문이다. 
한 회의가 끝나는 시각에, 같은 회의실에서 다른 회의가 시작하는 것은 허용된다. 이 경우 두 회의가 겹치지 않기 때문이다. 
길이가 0인 회의, 즉 시작 시각과 종료 시각이 동일한 회의는 예약된 바 없으며, 새롭게 잡을 수도 없다.
이미 예약된 M개의 회의에 대한 정보가 주어지면, 회의실별로 비어 있는 시간대를 정리해 출력하는 프로그램을 작성해 보자. 구체적인 형식은 아래의 을 참고하시오.

3 7
grandeur
avante
sonata
sonata 14 16
grandeur 11 12
avante 15 18
sonata 10 11
avante 9 12
grandeur 16 18
avante 12 15

출처 : https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=626

 

static int start_time = 9;
static int end_time = 18-start_time;

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str);
int meetingRoomNum = Integer.parseInt(st.nextToken());
int meetingCnt = Integer.parseInt(st.nextToken());
HashMap<String, boolean[]> map = new HashMap<String, boolean[]>();
boolean[][] timeArr = new boolean[meetingRoomNum][end_time];
ArrayList<String> roomList = new ArrayList<String>();

//미팅룸 설정
for(int i=0; i<meetingRoomNum; i++) {
    str = br.readLine();
    st = new StringTokenizer(str);
    String meetingRoom = st.nextToken();
    roomList.add(meetingRoom);
    map.put(meetingRoom, timeArr[i]);			
}

//미팅룸에 해당하는 회의시간 설정
for(int i=0; i<meetingCnt; i++) {
    str = br.readLine();
    st = new StringTokenizer(str);
    String meetingRoom = st.nextToken();
    int start = Integer.parseInt(st.nextToken());
    int end = Integer.parseInt(st.nextToken());
    boolean[] value = map.get(meetingRoom);
    for(int k=start-start_time; k<end-start_time; k++) {
        value[k] = true;								
    }
    map.put(meetingRoom, value);
}

Collections.sort(roomList);

for(int idx = 0; idx < roomList.size(); idx++) {
    String room = roomList.get(idx);
    System.out.println("Room "+room+":");
    boolean[] value = map.get(room);
    int availableCnt = 0;
    ArrayList<String> str_list = new ArrayList<String>();
    int prev = -1;
    for(int k=0; k<end_time; k++) {
        if(!value[k]) {	//회의실이 비어 있으면
            if(prev == -1) {
                prev = k;
                availableCnt++;
            } else {
                if(k == end_time-1) {
                    int start = start_time + prev;
                    int end = start_time +k +1;
                    String start_str = (start < 10) ? "0"+Integer.toString(start) : Integer.toString(start);							
                    str_list.add(start_str +"-"+end);
                }
            }
        } else {
            if(prev != -1) {
                int start = start_time + prev;
                int end = start_time +k;
                String start_str = (start < 10) ? "0"+Integer.toString(start) : Integer.toString(start);							
                str_list.add(start_str +"-"+end);
                prev = -1;
            }
        }
}
if(availableCnt == 0) {
    System.out.println("Not available");
} else {
    System.out.println(availableCnt+" available:");
    Iterator<String> iter = str_list.iterator();
    while(iter.hasNext()) {
        System.out.println(iter.next().toString());
    }				
}
if(roomList.size() != idx+1) {
    System.out.println("-----");
}
반응형

'Java' 카테고리의 다른 글

Android - Nested RecyclerView  (0) 2022.03.15
Coding - Smart Robot  (0) 2022.02.02