켘 어려워,,
구현하기 정말 빡세다.
simple한 오름차순은 sort로 해결가능한데,
hard한 오름차순은 queue로 해결해야 할 것 같다.
이거 출력하는 것도 빡세고ㅠ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main { //다 넣어놓고 이름 오름차순으로 정렬
static Queue<Room> rooms = new LinkedList<>();
static PriorityQueue<Room> pq = new PriorityQueue<>();
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
rooms.add(new Room(br.readLine(), new boolean[18]));
}
//입력
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
String reName = st.nextToken();
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
for (Room r : rooms) {
if (r.name.equals(reName)) {
for (int j = start; j < end; j++) {
r.times[j] = true;
}
}
}
}
//오름차순
while (!rooms.isEmpty()) {
pq.add(rooms.poll()); //queue에서 하나씩 뽑아서 priorityqueue에 add
}
while (!pq.isEmpty()) {
Room r = pq.poll();
sb.append("Room " + r.name + ":\n");
getPossibleTime(r.times);
if (pq.size() != 0) {
sb.append("-----\n");
}
}
System.out.println(sb.toString());
}
static void getPossibleTime(boolean[] times) {
//시작과 끝을 알려주는 커서
//투포인터 개념
boolean cursor = true;
int startPoint = -1, endPoint = -1;
int cnt = 0;
ArrayList<int[]> possibleTime = new ArrayList<>();
//시작과 끝을 표시
for (int i = 9; i < 18; i++) {
//이전 상태가 예약 가능(cursor == true)이고 현재 시간대가 예약 불가(times[i] == false)인 경우
if (cursor == true && times[i] == false) {
startPoint = i;
cursor = false;
} else if (times[i] == true && cursor == false) {
//현재 시간대가 예약 가능(times[i] == true)이고 이전 상태가 예약 불가능(cursor == false)인 경우
endPoint = i;
cursor = true;
//새로운 예약 가능 시간대(new int[] {startPoint, endPoint})를 추가
possibleTime.add(new int[] {startPoint, endPoint});
cnt++;
}
}
//마지막에 예약 가능한 시간대에 도달한다면
//s가 16시라면, 코드는 사용자가 16시부터 업무 종료 시간인 18시까지 예약할 수 있다는 정보를 possibleTime 리스트에 추가
if (cursor == false) {
cnt++;
possibleTime.add(new int[] {startPoint, 18});
}
if (cnt == 0) {
sb.append("Not available\n");
} else {
sb.append(cnt + " available:\n");
for (int i = 0; i < possibleTime.size(); i++) {
// start
if (possibleTime.get(i)[0] < 10) {
String ch = "0" + (possibleTime.get(i)[0] + "");
sb.append(ch + "-");
} else {
sb.append(possibleTime.get(i)[0] + "-");
}
//end
if (possibleTime.get(i)[1] < 10) {
String ch = "0" + (possibleTime.get(i)[1] + "\n");
sb.append(ch + "-");
} else {
sb.append(possibleTime.get(i)[1] + "\n");
}
}
}
}
}
class Room implements Comparable<Room> {
String name;
boolean[] times;
Room(String name, boolean[] times) {
this.name = name;
this.times = times;
}
//재정의
@Override
public String toString() {
return "Room{" +
"name='" + name + '\'' +
", times=" + Arrays.toString(times) +
'}';
}
public int compareTo(Room r) {
return this.name.compareTo(r.name); //name을 기준으로 오름차순 정렬
}
}