업데이트:


카테고리:

태그: ,


난이도

문제는 전반적으로 쉬운 편이었다. 물론 처음에는 틀렸지만, 교재 설명을 조금만 힌트 삼아서 보면 충분히 쉽게 풀 수 있는 문제였다.



문제

회의실 배정하기(백준: 1931번)

image



내 풀이

  • 나는 시작시간과 종료시간을 Node라는 새 클래스를 정의해서 표현했다.
  • Comparable의 compareTo 메소드를 구현해서 정렬 기준을 정의했다.
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Node a[] = new Node[n];
        for (int i = 0; i < n; i++) {
            int s = sc.nextInt();
            int e = sc.nextInt();
            a[i] = new Node(s, e);
        }
        Arrays.sort(a);

        int cnt = 0;
        int e = 0;
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                e = a[i].e;
                cnt++;
            } else {
                if (a[i].s >= e) {
                    e = a[i].e;
                    cnt++;
                }
            }
        }
        System.out.println(cnt);
    }
}

class Node implements Comparable<Node> {
    int s;
    int e;

    Node(int s, int e) {
        this.s = s;
        this.e = e;
    }

    public int compareTo(Node o) {
        if (this.e == o.e) {
            return this.s - o.s;
        }
        return this.e - o.e;
    }
}



교재 풀이

  • 교재에서는 시작시간과 종료시간을 2차원 배열로 표현했다.
  • Comparator의 compare 메소드를 구현해서 정렬 기준을 정의했다.
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class test {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();
    int[][] A = new int[N][2];
    for (int i = 0; i < N; i++) {
      A[i][0] = sc.nextInt();
      A[i][1] = sc.nextInt();
    }
    Arrays.sort(A, new Comparator<int[]>() {
      @Override
      public int compare(int[] S, int[] E) {
        if (S[1] == E[1]) { // 종료 시간이 같을 경우
          return S[0] - E[0];
        }
        return S[1] - E[1];
      }
    });
    int count = 0;
    int end = -1;
    for (int i = 0; i < N; i++) {
      if (A[i][0] >= end) { // 겹치지 않는 다음 회의가 나온경우
        end = A[i][1]; // 종료시간 업데이트
        count++;
      }
    }

    System.out.println(count);
  }
}