[소프티어] 회의실 예약 ( 정렬을 queue로 )

Loopy·2024년 3월 6일
0

코테 문제들

목록 보기
102/113

켘 어려워,,
구현하기 정말 빡세다.
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을 기준으로 오름차순 정렬
	}
}

profile
잔망루피의 알쓸코딩

0개의 댓글