[백준][1931번: 회의실 배정]

호준·2021년 12월 30일
0

Algorithm

목록 보기
18/111
post-thumbnail

문제 설명

  • 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.

접근 방식

  1. 회의 시작 시간과 끝나는 시간을 저장하는 2차배열을 만든다.
  2. 저장된 배열을 끝나는 시간으로 오름차순을 한다.(단, 끝나는 시간이 같을 경우 시작 시간이 빠른순으로 정렬)
  3. 반복문을 통해 해당 회의가 시작할 수 있는지 비교를 한다.

코드

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
public class Main {
  public static void main(String[] args) throws IOException{
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      int T = Integer.parseInt(br.readLine());
      int[][] time = new int[T][2];

      for(int i=0; i<T; i++){
        String[] str = br.readLine().split(" ");
        time[i][0] = Integer.parseInt(str[0]); // 시작시간
        time[i][1] = Integer.parseInt(str[1]); // 종료시간
      }

      Arrays.sort(time, new Comparator<int[]>() { // 끝나는 시간 기준으로 오름차순
        @Override
        public int compare(int[] o1, int[] o2){

          if(o1[1] == o2[1]){ //종료 시간이 같을 때 시작시간이 빠른 순으로 정렬
            return o1[0] - o2[0];
          }
          return o1[1] - o2[1];
        }
      });
      int count=0; // 회의 개수를 위한 변수
      int end=0; // 이전 회의 끝난 시간을 저장하는 변수
      for(int i=0; i<T; i++){
        if(end <= time[i][0]){ // 이전 회의 끝난 시간이 다음 시작시간보다 작거나 같을 때
          end = time[i][1];
          count++;
        }
      }
      System.out.println(count);
      
  }
}

배울 점

배열을 sort할 때

Arrays.sort(time, new Comparator<int[]>() {
        @Override
        public int compare(int[] o1, int[] o2){} 

sort를 하는 방식으로 어떻게 할까 고민이 많이 했었는데 문제를 통해서 위와 같은 방식으로 sort할 수 있는 것을 알게 되었다.

profile
도전하자

0개의 댓글