본문 바로가기

개발중/Algorithm

MeetingRoom2 응용 (정)

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