목차
링크 :
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;
}
}