[Do It! 코딩테스트 자바편(김종관)] 문제 035(백준: 1931번)
난이도
문제는 전반적으로 쉬운 편이었다. 물론 처음에는 틀렸지만, 교재 설명을 조금만 힌트 삼아서 보면 충분히 쉽게 풀 수 있는 문제였다.
문제
내 풀이
- 나는 시작시간과 종료시간을 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);
}
}