https://www.acmicpc.net/problem/2457
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
// 꽃을 피는 날 기준 오름차순으로, 같다면 지는 날 내림차순으로 정렬
// 피는 날, 지는 날은 (달 * 100 + 일)로 표현
// 시작 일(3/1)부터 종료 일(11/30까지)까지로 설정해놓고 꽃의 배열을 순환
// 해당 꽃이 시작일보다 이후에 피기 시작한다면 꽃을 피는 날 기준으로 오름차순으로 정렬해놨었는데 시작일 이후에 핀다면 3/1부터 펴야 한다는 조건을 만족하지 못함
// -> break
// 해당 꽃이 시작일 이전 혹은 그 날 피기 시작하는 꽃들을 순회하면서 그 중 지는 날이 가장 긴 꽃을 찾음
// 새 꽃을 찾았다는 것을 나타내기 위해 boolean 타입을 true로 변경
// 그러다 시작일 이후에 피는 꽃이 등장한다면 break
// 새 꽃을 찾았다면 시작일을 지는 날이 가장 긴 꽃의 지는 날로 변경, 선택된 꽃의 개수를 1 증가
public class Main {
static int N;
static Flower[] flowers;
static void input() {
Reader scanner = new Reader();
N = scanner.nextInt();
flowers = new Flower[N];
for(int idx = 0; idx < N; idx++) {
int startMonth = scanner.nextInt(), startDay = scanner.nextInt();
int endMonth = scanner.nextInt(), endDay = scanner.nextInt();
int start = startMonth * 100 + startDay;
int end = endMonth * 100 + endDay;
flowers[idx] = new Flower(start, end);
}
}
static void solution() {
Arrays.sort(flowers);
int start = 301, end = 1201;
int count = 0, max = 0, index = 0;
while(start < end) {
boolean hasNext = false; // 새 꽃 찾은지 여부
for(int idx = index; idx < N; idx++) {
// 종료일이 시작일이 이후면 의미 없음. 종료일에는 시작해야 이어지기 때문
if(flowers[idx].start > start) break;
if(max < flowers[idx].end) {
hasNext = true;
max = flowers[idx].end;
index = idx + 1;
}
}
if(hasNext) {
start = max;
count++;
} else break;
}
if(max < end) System.out.println(0);
else System.out.println(count);
}
static class Flower implements Comparable<Flower> {
int start, end;
public Flower(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public int compareTo(Flower o) {
if(start != o.start) return start - o.start;
return o.end - end;
}
}
public static void main(String[] args) {
input();
solution();
}
static class Reader {
BufferedReader br;
StringTokenizer st;
public Reader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
}
}