풀이
소프티어 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 |