본문 바로가기
ProgramSolve/Softeer

[Softeer] Lv2. 회의실 예약 (Java)

by SooooooooS 2024. 2. 2.
728x90

1. 문제


2. 풀이 과정 및 정리

구현 문제라서 차근차근 해나아가면 된다.

이번에 쓰인 헷갈린 java 문법을 정리해보려고 한다.

1. 리스트 배열

List<T>[] arrList = new ArrayList[n];

위와 같이 리스트 배열을 선언한다.

주의 : new 이후에는 배열의 크기만 쓴다. → 리스트 속 타입을 쓸 수 없다.

for(int i = 0; i < n; i++) {
	arrList[i] = new ArrayList<>();
}

그 후 각 리스트를 초기화해준다.

2. HashMap key 값으로 정렬하기

HashMap<key, value> map = new HashMap<>();

List<T> keyList = new ArrayList<>(map.keySet());
Collections.sort(keyList);

map의 key들의 값을 keySet()으로 가져온 후 리스트로 만든다.

Collections의 sort()를 이용하여 정렬한다.

 

<참고> value를 기준으로 정렬하기 → Map의 Entry 이용하기

List<Map.Entry<key, value>> entryList = new ArrayList<>(map.entrySet());
entryList.sort(new Comparator<Map.Entry<key, value>>() {
    @Override
    public int compare(Map.Entry<key, value> o1, Map.Entry<key, value>o2) {
    	return o1.getValue() - o2.getValue();
    }
});

3. 2자리 정수 형식

String.format("%02d", num);

<참고> 형식 지정자

  • %02d : (부족하면 앞에 0을 이용하여) 두 자리 정수로 표현
  • %.2f : 소수점 2자리까지 실수로 (반올림하여) 표현
  • %s : 문자열

3. 코드

import java.io.*;
import java.util.*;

public class Main {

    static class Time {
        int start, end;
        public Time(int start, int end) {
            this.start = start;
            this.end = end;
        }
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()); //회의실 개수
        int m = Integer.parseInt(st.nextToken()); // 회의 개수

        HashMap<String, Integer> map = new HashMap<>(); //회의실 이름 : 번호
        for(int i = 0; i < n; i++) {
            map.put(br.readLine(), i);
        }

        boolean[][] useTime = new boolean[n][10]; //회의실 별 9-18시 사이에 사용여부
        for(int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int roomNum = map.get(st.nextToken());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());

            for(int j = start; j < end; j++) {
                useTime[roomNum][j-9] = true; //9시 = 0번 인덱스
            }
        }

        List<String> keyList = new ArrayList<>(map.keySet());
        Collections.sort(keyList); //회의실 이름 사전순으로 정렬

        ArrayList<Time>[] availableTimes = new ArrayList[n]; //각 회의실별 사용 가능 시간
        for(int k = 0; k < keyList.size(); k++) {
            String name = keyList.get(k);
            bw.write("Room "+name+":\n");
            int roomNum = map.get(name);
            availableTimes[roomNum] = new ArrayList<>();
            int start = -1;
            boolean end = false;
            for(int i = 0; i < 10; i++) {
                if(!useTime[roomNum][i]) { //회의실이 사용중이지 않다면
                    if(start == -1) { //회의실이 비어있는 첫 시간일 경우
                        start = i + 9;
                        end = false;
                    }
                }
                //회의실이 사용중인 경우
                else if(start != -1 && !end) { //시작시간이 존재하며 끝 시간이 정해져 있지 않은 경우
                    availableTimes[roomNum].add(new Time(start, i+9));
                    start = -1;
                    end = true;
                }
            }
            if(start != 18 && !useTime[roomNum][9]) { //끝 시간 회의실이 사용중이진 않을 경우
                availableTimes[roomNum].add(new Time(start, 18));
            }
            
            if(availableTimes[roomNum].isEmpty()) {
                bw.write("Not available\n");
            }
            else {
                bw.write(availableTimes[roomNum].size() + " available:\n");
                for(Time t : availableTimes[roomNum]) {
                    bw.write(String.format("%02d", t.start) + "-" + String.format("%02d", t.end) + "\n");
                }
            }
            
            if(k != keyList.size()-1){
                bw.write("-----\n");
            }
        }
        
        bw.flush();
        bw.close();
    }
}
728x90