너지살 2023. 8. 6. 18:41

목차

     

     

     

     

     

     

    링크 : 

    https://softeer.ai/practice/info.do?idx=1&eid=626&sw_prbl_sbms_sn=245666 

     

    Softeer

    연습문제를 담을 Set을 선택해주세요. 취소 확인

    softeer.ai

     

     

     

    문제 풀이

    여러 개의 회의실과 회의실 별 회의시간이 주어진다.

    이 상황에서 회의실 별 예약 가능 시간대 갯수와 예약 가능 시간대를 출력해야 합니다. 

     

    먼저 회의실 이름을 List<String>으로 받은 다음 정렬을 해주었습니다. 

    정렬을 한 인덱스 값을 회의실의 번호라 생각했습니다. 

     

    다음은 int형의 2차원 배열 timetable을 생성했습니다.

    행은 방의 갯수만큼 설정했고 열은 시간대인 9 ~ 18 시의 갯수인 9개로 설정했습니다.

    그 후 회의실 별 회의 시간을 입력 받아 timetable에 기록했습니다.

     

    이 기록을 바탕으로 회의 시간 대 갯수와 회의 시간대를 계산했습니다.

    timetable[0][0] 은 0번방이 9~10시까지 사용 유무를 나타냅니다. 사용하면 1 사용하지 않으면 0 입니다.

    시작 시간이 9시여도 배열은 0부터 시작하기 때문에 -9를 해서 배열에 저장했습니다. 

    int type 변수를 선언하여 시간의 이어짐을 체크 했습니다.

    int count 변수를 선언하여 예약 가능 시간대가 몇 개 인지 세었습니다. 

    또한 List<Integer> start, List<Integer> end를 선언하여 시작시간과 끝시간을 저장했습니다.

    for문을 돌려 처음 timetable[roomNumber][i] = 0을 만나고 type = 0 이면 start에 시간을 저장하고 type 을 1로 바꾸었습니다. 또한 count 을 갯수를 1 올렸습니다. 

    그 후 계속 0을 만나도 type = 1 이므로 start에 저장되지 않게 했습니다.

    end도 마찬가지로 timetable[roomNumber][i] = 1을 만나고 type = 1 이면 end에 시간을 저장하고 type 을 0으로 바꾸어 연속해진 값이 저장되지 않게 했습니다. 그리고 18시에 끝나는 것은 for문에 끝이라 배열에 담지 못하므로 start와 end의 크기를 비교하여 end가 하나 더 적으면 18을 저장하도록 했습니다. 

     

    int count에 예약 가능 시간대에 갯수를 List<Integer> start, List<Integer> end에 각각 시작시간과 끝시간을 담았습니다.

    출력단에서는 if문을 걸어 count가 0일 때와 1 이상일 때로 나누어 StringBuilder 출력을 담았습니다. 

     

    소스 코드 

    import java.util.*;
    import java.io.*;
    
    
    /*
    grandeur
    11 12 => 11 
    16 18 => 16 17 
    
    09 11 
    12 16 
    
    구간을 체크
    
    1 09 ~ 10 
    2 10 ~ 11
    3 11 ~ 12 check 
    4 12 ~ 13
    5 13 ~ 14
    6 14 ~ 15
    7 15 ~ 16
    8 16 ~ 17 check
    9 17 ~ 18 check 
    
    */
    
    
    public class Main
    {
        static int n; // 회의실 개수
        static int m; // 예약 갯수 
    
        static List<String> room; 
        static int[][] timetable; 
    
        static StringBuilder sb;
    
        public static void main(String args[]) throws IOException 
        {
            sb = new StringBuilder(); 
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
            StringTokenizer st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken());
            m = Integer.parseInt(st.nextToken()); 
    
            // 이름 입력, 정렬 
            room = new ArrayList<>();
            for(int i = 0; i < n; i++) {
                room.add(br.readLine()); 
            }
            Collections.sort(room);
    
            // 회의실당 예약 시간을 기록하는 2차원 배열 
            timetable = new int[n][9]; 
    
            // 방에 따른 사용 시간을 배열에 저장한다. 
            for(int i = 0; i < m; i++) {
                String input = br.readLine();
                String[] str = input.split(" ");
                int number = room.indexOf(str[0]);
                int start = Integer.parseInt(str[1]) - 9;
                int end = Integer.parseInt(str[2]) - 9;
    
                for(int j = start; j < end; j++) {
                    timetable[number][j] = 1; 
                }
            }
    
    
    
            // 방에 따른 예악 가능 시간대에 갯수에 예약 가능 시간 대 구하기 
            for(int i = 0; i < n; i++) {
                check(i); 
                if(i == n-1) {
                    continue;
                }
                sb.append("-----\n");
            }
    
     
    
            System.out.println(sb);
        }
    
        public static void check(int roomNumber) {
            String roomName = room.get(roomNumber);
            sb.append("Room " + roomName + ":\n");
    
            List<Integer> start = new ArrayList<>(); // 시작 시간
            List<Integer> end = new ArrayList<>(); // 끝난 시간 
    
            // 예약 가능 시간 갯수 새기 
            int type = 0;
            int count = 0;
            for(int i = 0; i < 9; i++) {
                if(timetable[roomNumber][i] == 0 && type == 0) {
                    count += 1; 
                    type = 1;
    
                    start.add(i + 9); 
                }
                if(timetable[roomNumber][i] == 1 && type == 1) {
                    type = 0;
                    end.add(i + 9);
                }
            }
    
            if(start.size() != end.size()) {
                end.add(18); 
            }
    
    
            // 예약 가능 시간 대가 없는 경우 
            if(count == 0) {
                sb.append("Not available\n");
            }
            // 예약 가능 시간 대가 있는 경우 
            else {
                sb.append(count + " available:\n");
    
                for(int i = 0; i < count; i++) {
                    String startTime = convert(start.get(i));
                    String endTime = convert(end.get(i)); 
    
                    sb.append(startTime + "-" + endTime + "\n");
                }
                
            }
        }
    
    
        // 9가 들어오면 09로 반환해주는 함수 
        public static String convert(int time) {
            String result = "";
            if(time == 9) {
                result = "0" + time;
            }
            else {
                result = "" + time;
            }
            return result;
        }
    }