1. 문제
2457번: 공주님의 정원
첫째 줄에는 꽃들의 총 개수 N (1<=N<=100,000)이 주어진다. 다음 N개의 줄에는 각 꽃이 피는 날짜와 지는 날짜가 주어진다. 하나의 날짜는 월과 일을 나타내는 두 숫자로 표현된다. 예를 들어서, 3 8 7
www.acmicpc.net
2. 접근방법
회의실 배정문제를 반대로 꼬은 문제
기본적인 풀이 개념은
우선 시작시간을 기준으로 정렬을 하고 시작시간이 같다면 끝시간이 빠른게 앞으로 정렬하고
현재 끝시간보다 시작시간이 작으면서
끝시간이 최댓값인 것을 선택하고
끝 시간이 11월 30일을 초과하면 종료 하면 된다.
첫 끝 시간은 3월 1일로 설정하면 된다.
3. 자바 코드
package Gold;
import java.awt.Point;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;
public class G4_2457공주님의정원 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
ArrayList<Point> arr = new ArrayList<Point>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int a1 = Integer.parseInt(st.nextToken());
int a2 = Integer.parseInt(st.nextToken());
int b1 = Integer.parseInt(st.nextToken());
int b2 = Integer.parseInt(st.nextToken());
arr.add(new Point(a1 * 100 + a2, b1 * 100 + b2));
}
Collections.sort(arr, new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
if (o1.x == o2.x)
return o1.y - o2.y;
return o1.x - o2.x;
}
});
int last = 301;
int lastidx = -1;
int cnt = 0;
gg: while (true) {
int temp = last;
int i = lastidx;
boolean isget = false;
while (true) {
if (++i >= N) {
if (!isget) {
cnt = 0;
break gg;
}
break;
}
if (arr.get(i).x > temp) {
if (!isget) {
cnt = 0;
break gg;
}
break;
}
if (arr.get(i).y > last) {
lastidx = i;
last = arr.get(i).y;
isget = true;
}
}
cnt++;
if (last >= 1201)
break;
}
System.out.println(cnt);
}
}
4. 마치며
회의실 배정을 조금 꼬았다는 건 알았는데
역시 그리디는 조금 어려운 것 같다.
그리디 많이 풀어보자
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준] 14503 로봇청소기 (2) | 2020.12.30 |
---|---|
[백준] 1034 램프 (0) | 2020.12.18 |
[백준] 16287 Parcel (0) | 2020.12.15 |
[백준] 20303 할로윈의 양아치 (0) | 2020.12.10 |
[백준] 20209 스트레이트 스위치 게임 (부분집합) (0) | 2020.12.05 |