문제, 제약 조건 참고
풀이
- 강의실 이름을 받을 배열 하나 생성 후 값을 입력받고 Arrays.sort()를 이용하여 정렬해준다
- 각 강의실 String key값에 알맞은 빈강의실 시간 체크용 boolean[] value값을 만들어준다.(HashMap<String, boolean[9] 통해서 구현), 추가로 배열을 10으로 안한건 시작시간이 9시면 9-10, 17시면 17-18사용이기 때문에 전체시간을 9-17로 생각했다
(그림 1참고) - 각 테스트 케이스가 들어오면 해당 강의실 이름을 hashmap.get(강의실 이름)을 줘서 해당 시간대를 가져온다. 이후에 강의시간으로 사용하는 시간을 true로 변경해준다(그림 2참고)
- 마지막으로 빈강의실을 로직에 맞게 체크해주고 출력해준다(그림 3참고)
예제 입력 예시
3 7
grandeur
avante
sonata
sonata 14 16
grandeur 11 12
avante 15 18
sonata 10 11
avante 9 12
grandeur 16 18
avante 12 15
예제 출력 예시
Room avante:
Not available
-----
Room grandeur:
2 available:
09-11
12-16
-----
Room sonata:
3 available:
09-10
11-14
16-18
소스코드
import java.io.*;
import java.util.*;
public class Main {
private static int startNum;
private static int endNum;
private static StringBuilder sb;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int t = Integer.parseInt(st.nextToken());
String[] roomsName = new String[r];
//n=0일때 9, n=8일때 17, 참고로 17이면 17-18이다 따라서 배열크기 9
HashMap<String, boolean[]> hashMap = new HashMap<>();
for (int i = 0; i < r; i++) {
roomsName[i] = br.readLine();
hashMap.put(roomsName[i], new boolean[9]);
}
Arrays.sort(roomsName);
//test케이스, 항상 9시간 빼주고 비교
for (int i = 0; i < t; i++) {
st = new StringTokenizer(br.readLine());
String roomName = st.nextToken();
int startTime = Integer.parseInt(st.nextToken());
int endTime = Integer.parseInt(st.nextToken());
boolean[] curRoomTime = hashMap.get(roomName);
for (int j = startTime - 9; j < endTime - 9; j++) {
curRoomTime[j] = true;
hashMap.put(roomName, curRoomTime);
}
}
StringBuilder allSb = new StringBuilder();
sb = new StringBuilder();
//출력
for (int i = 0; i < r; i++) {
allSb.append("Room ").append(roomsName[i]).append(":").append("\n");
//빈 강의실 찾기전 변수들 초기화
int count = 0;
boolean startCheck = false;
startNum = 0;
endNum = 0;
sb.setLength(0);
boolean[] curRoomTimeBoolean = hashMap.get(roomsName[i]);
for (int j = 0; j < 9; j++) {
if (!curRoomTimeBoolean[j]) {
if (!startCheck) {
startCheck = true;
startNum = j;
endNum = j + 1;
count++;
if (endNum == 9) emptyRoomAddStringBuilder();
} else {
endNum++;
if (endNum == 9) emptyRoomAddStringBuilder();
}
} else {
if (startCheck) {
startCheck = false;
emptyRoomAddStringBuilder();
}
}
}
//출력문 저장 관련 로직
if (count == 0) allSb.append("Not available\n");
else allSb.append(count).append(" available:\n");
allSb.append(sb);
if (i != r - 1) allSb.append("-----\n");
}
System.out.println(allSb);
}
private static void emptyRoomAddStringBuilder() {
if (startNum == 0) sb.append("0").append(startNum + 9).append("-").append(endNum + 9).append("\n");
else sb.append(startNum + 9).append("-").append(endNum + 9).append("\n");
}
}
'알고리즘 > 자바' 카테고리의 다른 글
[프로그래머스] 49189번 자바(Java) 가장 먼 노드 (0) | 2024.07.10 |
---|---|
[백준 알고리즘] 2110번 자바(Java) 공유기 설치 (0) | 2024.05.23 |
[백준 알고리즘] 11559번 자바(Java) (0) | 2024.03.03 |
[백준 알고리즘] 16637번 자바(Java) 괄호 추가하기 (1) | 2024.02.25 |
[백준 알고리즘]20055번 자바(Java)컨베이어 벨트 위의 로봇 (0) | 2024.02.25 |