코딩테스트/Softeer

[Softeer]회의실 예약 - Java

GAEBAL 2022. 5. 18. 23:49
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