본문 바로가기
to be 개발자

[알고리즘_자바] MeetingRoom 미팅룸 사용 시간 겹치지 않는지 확인하기

by 아셀acell 2020. 9. 17.
반응형

인프런 강의를 듣기 시작했다.

그리고 미팅룸 수업이 첫 수업이었는데 깜짝 놀랐다.

 

int, String 같은 클래스 종류를 만들어서 그걸 받아서 사용하는 법... 

상상치 못한 문제풀이 방법이었다. 

 

나는 당연히 2차원 배열로 풀려고 헀는데 그것보다 훨씬

정갈하고 보기 좋은 방법!

 

문제

 

인풋 {{15,20},{5,10},{0,30}}

아웃풋 false

 

0---------------------30

   5----10 15----20 

미팅룸 사용시간이 겹치면 false

겹치지 않으면 true

 

 

풀이

 

 

package practiceJ;

 

import java.util.Arrays;

import java.util.Comparator;

 

class Se{   // 먼저 이렇게 미팅룸 사용 시작시간, 끝 시간을 담아주는 클래스를 만드는 것이 시작이다. 

   int start;

   int end;

   

   Se(){

      start=0; // Se s = new Se(); 로 초기화 하면 시작, 끝 시간은 둘다 0이다. 

      end=0;

   }

   

   Se(int start, int end){  // Se e = new Se(0,10); 하지만 클래스에 start, end 인수를 넣어주면 시작, 끝 시간이 정해진다. 

      this.start = start;

      this.end = end;

   }

}

 

public class MeetingRoom {

 

   public static void main(String[] args) {

 

      Se se1 = new Se(15,20);

      Se se2 = new Se(5,10);

      Se se3 = new Se(0,30);  // 문제에서 제시한 세가지 시작, 끝시간 세트를 생성했다.

      

      Se[] ses = {se1, se2, se3}; 

// 그리고 그 세트를 이렇게 Se 배열에 담을 수 있다.

 

String string1 = "string1";

String string2 = "string2"; 

String[] s = {string1, string2}; // 이런식으로 Se는 String과 같이 하나의 객체가 되었기 때문에 이렇게 사용할 수 있다. 

      

      MeetingRoom m = new MeetingRoom();      

      System.out.println(m.solve(ses)); // 위에 미팅룸 전체를 받아왔기에 미팅룸 안에 만든 solve 메소드를 쓸 수 있다. 

      

 

   }

   

   boolean solve(Se[] ses) { // solve 메소드는 Se 배열을 받아와서 

      //1

      if(ses == null) { // 혹시 Se 배열이 비어있다면 false를 리턴하고 

         return false;

      }

      

      Arrays.sort(ses, Comp);  // 그게 아닐 시 Se[] 배열을 오름차순 정열한다. 

//sort() 메서드의 2번째 인자에 Comparator를 익명클래스로 전달하여 정렬기준을 재정의하는 것 

//이렇게 하면 ses가 start 기준으로 오름차순 된다 (0,30 - 5,10 - 15,20)

      

      //2

      for(int i=1;i<ses.length;i++) {  

         if(ses[i-1].end > ses[i].start) {

// 그래서 뭘 비교하냐면, 지금 start 시간이 오름차순 정렬 됐으니까 

// 보다 빠른 스타트 시간이 앞에 있는데 그 다음 스타트 시간이 앞 스타트 타임과 겹치느냐 안겹치느냐를 보면 된다 

// 그래서 i를 0 아니고 1 부터 시작해서 ses[0].end와 ses[1].start를 비교하고 ses[1].end와 ses[2].start를 비교한다

// 그래서 start가 end보다 작으면 끝나기 전에 시작하겠다, 즉 겹친다는 것이므로 return false를 준다 

            return false;

         }

      }

      return true;

   }//boolean

   

   Comparator<Se> Comp = new Comparator<Se>() {

// Comparable 과 Comparator 는 정렬과 관련된 인터페이스. sort() 메소드 관련

// 왜? 객체의 비교기준을 정해서 정렬을 시켜주기 위해서. Comparable 인터페이스가 필요

      @Override

      public int compare(Se se1, Se se2) {

         return se1.start - se2.start; // start 시간이 정렬기준 

         // - = 오름차순 // 오름,내림은 1,2번째 인자를 통해 결정 

         // - = 내림차순 

      }

   };

   

   public void print(Se[] ses) {

      for(int i=0;i<ses.length;i++) {

         Se a = ses[i];

         System.out.println(a.start + " " + a.end);

      }

   }

 

}

 

728x90
반응형
LIST

댓글