728x90
1. 문제
- 문제 링크: Lv2. 회의실 예약
- 주제 : 구현
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
'ProgramSolve > Softeer' 카테고리의 다른 글
[Softeer] Lv3. 비밀메뉴2 (Java) (0) | 2024.02.20 |
---|---|
[Softeer] Lv2. 지도 자동 구축 (Java) (0) | 2024.02.16 |
[Softeer] Lv3. 성적평가 (Java) (0) | 2024.02.04 |
[Softeer] Lv3. 순서대로 방문하기 (Java) (2) | 2024.02.03 |
[Softeer] Lv3. 자동차 테스트 (Java) (0) | 2024.02.02 |