본문 바로가기
Algorithm/소프티어

[Softeer] 회의실 예약 - JAVA

by LeeGangEun 2023. 8. 3.

 

회의실 예약 문제 바로가기

풀이

소프티어 lv2 문제중엔 가장 어려운듯?..
로직자체는 간단하지만, 구현이 꽤 복잡하다.

먼저 2개의 컬렉션이 사용한다.
1. mettingRoomList -> 단순히 회의실의 이름을 저장하는 리스트
2. reservationManageMap 
   * Key: 회의실 이름
   * Value : 예약한 시간을 나타내는 boolean 배열

map에 저장을 할때는 회의 시작 시간부터 회의 종료 시간까지 순회하며 값을 true로 바꿔줬다.
(종료시간은 포함하지 않는다. 문제에도 나와있지만, 종료시간과 시작시간은 겹칠 수 있기 때문이다.)

그후 회의실 이름을 정렬 후
map에서 순회하며 StringBuilder에 값을 넣어주면되는데,
이 과정이 좀 복잡했다...

나머지는 아래 코드 참조...

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int numMeetingRooms = Integer.parseInt(st.nextToken());
        int numReservations = Integer.parseInt(st.nextToken());

        Map<String, boolean[]> reservationMap = new HashMap<>();

        List<String> meetingRooms = new ArrayList<>();
        for (int i = 0; i < numMeetingRooms; i++) {
            meetingRooms.add(br.readLine());
        }

        for (int i = 0; i < numReservations; i++) {
            st = new StringTokenizer(br.readLine());
            String meetingRoom = st.nextToken();
            int startHour = Integer.parseInt(st.nextToken());
            int endHour = Integer.parseInt(st.nextToken());

            boolean[] timeUsedArr = reservationMap.getOrDefault(meetingRoom, new boolean[19]);
            for (int j = startHour; j < endHour; j++) {
                timeUsedArr[j] = true;
            }

            reservationMap.put(meetingRoom, timeUsedArr);
        }

        Collections.sort(meetingRooms);
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < numMeetingRooms; i++) {
            String meetingRoom = meetingRooms.get(i);
            boolean[] timeArr = reservationMap.getOrDefault(meetingRoom, new boolean[19]);
            List<String> availableHours = new ArrayList<>();

            int lastHour = 0;

            for (int j = 9; j <= 18; j++) {
                if (lastHour == 0 && !timeArr[j]) {
                    lastHour = j;
                    continue;
                }

                if (lastHour != 0 && timeArr[j]) {
                    availableHours.add(String.format("%02d-%02d", lastHour, j));
                    lastHour = 0;
                }
            }

            if (lastHour != 0 && lastHour != 18) {
                availableHours.add(String.format("%02d-18", lastHour));
            }

            sb.append("Room ").append(meetingRoom).append(":").append("\n");
            sb.append(availableHours.isEmpty() ? "Not available" : availableHours.size() + " available:").append("\n");
            for (String hourRange : availableHours) {
                sb.append(hourRange).append("\n");
            }
            if (i < numMeetingRooms - 1) {
                sb.append("-----").append("\n");
            }
        }

        System.out.println(sb);
    }
}

 

 

'Algorithm > 소프티어' 카테고리의 다른 글

[Softeer] 바이러스 - JAVA  (0) 2023.08.03
[Softeer] GBC - JAVA  (0) 2023.08.03
[Softeer] 비밀 메뉴 - JAVA  (0) 2023.08.03
[Softeer] 지도 자동 구축 - JAVA  (0) 2023.08.03
[Softeer] 장애물 인식 프로그램 - JAVA  (0) 2023.08.02