알고리즘/자바

[소프티어 21년 재직자 대회 예선]회의실 예약

Ash_jisu 2024. 3. 22. 13:48

문제, 제약 조건 참고

https://softeer.ai/app/assessment/index.html?xid=102028&xsrfToken=9bwXqOhPN1B0nuaGBcczAKTp5pyrNhl3&testType=practice

 

Candidate | Softeer Assessment UI

 

softeer.ai

풀이

  1. 강의실 이름을 받을 배열 하나 생성 후 값을 입력받고 Arrays.sort()를 이용하여 정렬해준다
  2. 각 강의실 String key값에 알맞은 빈강의실 시간 체크용 boolean[] value값을 만들어준다.(HashMap<String, boolean[9] 통해서 구현), 추가로 배열을 10으로 안한건 시작시간이 9시면 9-10, 17시면 17-18사용이기 때문에 전체시간을 9-17로 생각했다
    (그림 1참고)
  3. 각 테스트 케이스가 들어오면 해당 강의실 이름을 hashmap.get(강의실 이름)을 줘서 해당 시간대를 가져온다. 이후에 강의시간으로 사용하는 시간을 true로 변경해준다(그림 2참고)
  4. 마지막으로 빈강의실을 로직에 맞게 체크해주고 출력해준다(그림 3참고)

그림 1

 

그림 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");
    }
}