728x90
문제
https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=626
풀이
처음 풀어보는 현대 문제임!!
별 두개라 그냥 쉽게 풀 수 있을 줄 알았는데, 생각보다 어려워서 오래 걸렸다리,,,, 아니 이게 별 두개라고,,,???
진짜 나는 한참 멀었다 ㅠ 후우우우ㅜㅜ우ㅜ
암튼 포인트는
출력할 때 사전순으로 회의실 정보를 출력해야 되는 것
회의실 사용 가능 시간을 체크할 방식을 찾는 법 -> 나는 시간대 만큼의 크기를 가진 배열을 만들어줘서 체크했음!
그리고 출력할 때 형식을 맞춰줘야 되어서 여간 귀찮은게 아니었다!
자세한건 코드에다가 주석으로 달아놨음!!
코드
// Softeer - [21년 재직자 대회 예선] 회의실 예약
// https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=626
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Num626_회의실예약 {
static String[] strArr;
static boolean[][] time;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
strArr = new String[N]; // 회의실 배열
time = new boolean[N][18]; // 회의실 0시 ~ 18시 회의실 사용 가능 여부 배열
for (int i = 0; i < N; i++) {
strArr[i] = br.readLine();
}
// 후에 출력을 회의실 이름 순으로 해야하기 때문에 미리 정렬
Arrays.sort(strArr);
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
String str = st.nextToken();
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
// 회의실 사용하는지 체크하는 함수
useRoom(getRoomName(str), start, end);
}
// 출력
for (int i = 0; i < N; i++) {
sb.append("Room ").append(strArr[i]).append(":").append("\n");
sb.append(timeCheck(i)); // 얼마나 회의실을 이용할 수 있는지 알 수 있는 함수
sb.append("-----").append("\n");
}
sb.setLength(sb.length() - 7);
System.out.println(sb);
}
// 얼마나 회의실을 이용할 수 있는지 알 수 있는 함수
private static String timeCheck(int index) {
StringBuilder sb1 = new StringBuilder(); // 몇 개의 시간대가 남았는지 기록
StringBuilder sb2 = new StringBuilder(); // 몇 시부터 몇시까지 회의실 사용한지 기록
sb1.append("");
sb2.append("");
int start = 0, end = 0; // 회의실 사용 가능 시작 시간, 회의실 사용 가능 종료 시간
boolean flag = false; // 회의실 사용 가능인지 아닌지 판별하는 flag
int count = 0; // 회의실 사용가능 시간대가 몇개인지 count
for (int i = 9; i < 18; i++) {
if (!flag && !time[index][i]) { // 회의 중이 아니고, 회의실 사용하고 있지 않으면
flag = true; // 회의실 사용 가능으로 바꾸고
start = i; // 회의실 사용 가능 시작 시간 담아두기
} else if (flag && time[index][i]) {
flag = false; // 회의실 사용 불가로 바꾸고
end = i; // 회의실 사용 가능 종료 시간 담아두기
if (start == 9) { // 회의실 사용 가능 시작 시간이 9시면 앞에 0붙여서 09시로 만들기
sb2.append("0" + start).append("-").append(end).append("\n");
} else {
sb2.append(start).append("-").append(end).append("\n");
}
count++;
}
}
if (flag == true) { // 마지막 18시까지 회의실 사용 가능이면
// flag가 처음에 true로 바뀌고 변화가 없기 때문에 flag가 아직 true라면 end=18임
if (start == 9) {
sb2.append("0" + start).append("-").append(18).append("\n");
} else {
sb2.append(start).append("-").append(18).append("\n");
}
count++;
}
if (count == 0) { // 회의실 사용 가능 시간대가 없으면
sb1.append("Not available\n");
} else { // 회의실 사용 가능 시간대가 있으면
sb1.append(count + " available:\n");
}
// sb1이랑 sb2 합쳐주기기
sb1.append(sb2);
return sb1.toString();
}
// 어느 회의실을 룩업할 건지 인덱스를 꺼내오는 함수
private static int getRoomName(String str) {
for (int i = 0; i < strArr.length; i++) {
if (strArr[i].equals(str)) {
return i;
}
}
return 0;
}
// 어떤 회의실인지, 회의 시작 시간, 회의 종료 시간 을 받아서 회의실을 사용하고 있는 시간이면 true로 체크
private static void useRoom(int roomNum, int start, int end) {
for (int i = start; i < end; i++) {
time[roomNum][i] = true;
}
}
}
728x90