728x90
반응형
미팅룸 알고리즘을 배웠는데
사용자에게 입력을 받아서 처리를 하는 프로그램으로 응용해보고 싶다는 생각이 들어서, 완성
package soobin;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
class Interval4 {
int start;
int end;
Interval4() {
start = 0;
end = 0;
}
Interval4(int s, int e) {
start = s;
end = e;
}
}
public class MeetingRoom2c {
public static void main(String[] args) {
MeetingRoom2c m = new MeetingRoom2c();
Scanner sc = new Scanner(System.in);
int check;
do {
System.out.print("\n start: ");
int start = sc.nextInt();
System.out.print(" end : ");
int end = sc.nextInt();
Interval4 in1 = new Interval4(start, end);
check = m.solve(in1);
} while (check == 1);
}
public int solve(Interval4 interval) {
Scanner sc = new Scanner(System.in);
int iNum = 0;
if (list.isEmpty()) {
list.add(interval);
System.out.println("첫번째 미팅룸이 예약되었습니다");
return 1;
}
// 받은 interval 을 추가한다
list.add(interval);
// 오름차순으로 정렬한다 start 기준
list.sort(Comp);
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == interval) {
iNum = i;
break;
}
}
int s = list.size();
for (int i = 0; i < s; i++) {
System.out.println(" [ " + i + "] " + list.get(i).start + " ~ " + list.get(i).end);
}
int bNum = iNum - 1;
int aNum = iNum + 1;
int a, b =0;
if (s == aNum) {
if (list.get(bNum).end > interval.start) {
print(1);
return 1;
}
} else if (-1 == bNum) {
if (list.get(aNum).start < interval.end) {
print(1);
return 1;
}
} else if (list.get(bNum).end > interval.start || list.get(aNum).start < interval.end) {
print(1);
return 1;
}
print(2);
return 1;
}
public void print(int i) {
if (i == 1) {
System.out.println("원하는 시간대에 사용하는 미팅룸이 있어서 새로운 미팅룸을 추가합니다.");
System.out.println("현재 미팅룸 :" + ++total);
} else if( i == 2 ) {
System.out.println("중복되는 미팅룸이 없습니다.");
}
}
List<Interval4> list = new ArrayList<>();
Queue<Interval4> heap = new PriorityQueue<Interval4>();
int total = 0;
Comparator<Interval4> Comp = new Comparator<Interval4>() {
@Override
public int compare(Interval4 o1, Interval4 o2) {
return o1.start - o2.start;
}
};
}
if 문에 해당된다면
이미 미팅룸이 사용중인 시간이라는 의미다.
원하는 시간대에 사용 가능하다는 의미이다.
내가 입력한 데이터의 위치를 알아냈다.
오름차순으로 정렬 했기 때문에 내 위치를 파악하고 앞 뒤로 검사를 했다
현재 데이터 앞에 있는 데이터를 bNum
현재 데이터 뒤에 있는 데이터를 aNum
s는 리스트의 size를 의미.
리스트의 사이즈와 다음 사이즈가 같다면 내 뒤쪽은 검사할 필요가 없다.
내가 입력한 start보다 내 앞에 있는 데이터의 end가 더 크다면 중복
bNum 이 -1 이라면
내 앞에는 데이터가 존재하지 않는다.
내 뒤에만 검사하겠다.
이도 저도 아니다!
내 앞 뒤에 모두 검사할 데이터가 존재한다.
[ TEST ]
728x90
반응형
'개발중 > Algorithm' 카테고리의 다른 글
LicensKeyFormatting (0) | 2020.08.26 |
---|---|
JewelsAndStones (0) | 2020.08.26 |
MeetingRoom2 (0) | 2020.08.25 |
Merge 알고리즘 (0) | 2020.08.24 |
Daily Temperature (0) | 2020.08.23 |