Skip to content

Commit 3ecc1eb

Browse files
committed
[Gold III] Title: 공주님의 정원, Time: 404 ms, Memory: 45084 KB -BaekjoonHub
1 parent bf01252 commit 3ecc1eb

2 files changed

Lines changed: 103 additions & 0 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# [Gold III] 공주님의 정원 - 2457
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2457)
4+
5+
### 성능 요약
6+
7+
메모리: 45084 KB, 시간: 404 ms
8+
9+
### 분류
10+
11+
그리디 알고리즘, 정렬
12+
13+
### 제출 일자
14+
15+
2026년 3월 20일 15:21:33
16+
17+
### 문제 설명
18+
19+
<p>오늘은 공주님이 태어난 경사스러운 날이다. 왕은 이 날을 기념하기 위해 늘 꽃이 피어있는 작은 정원을 만들기로 결정했다.</p>
20+
21+
<p>총 N개의 꽃이 있는 데, 꽃은 모두 같은 해에 피어서 같은 해에 진다. 하나의 꽃은 피는 날과 지는 날이 정해져 있다. 예를 들어, 5월 8일 피어서 6월 13일 지는 꽃은 5월 8일부터 6월 12일까지는 꽃이 피어 있고, 6월 13일을 포함하여 이후로는 꽃을 볼 수 없다는 의미이다. (올해는 4, 6, 9, 11월은 30일까지 있고, 1, 3, 5, 7, 8, 10, 12월은 31일까지 있으며, 2월은 28일까지만 있다.)</p>
22+
23+
<p>이러한 N개의 꽃들 중에서 다음의 두 조건을 만족하는 꽃들을 선택하고 싶다.</p>
24+
25+
<ol>
26+
<li>공주가 가장 좋아하는 계절인 3월 1일부터 11월 30일까지 매일 꽃이 한 가지 이상 피어 있도록 한다.</li>
27+
<li>정원이 넓지 않으므로 정원에 심는 꽃들의 수를 가능한 적게 한다. </li>
28+
</ol>
29+
30+
<p>N개의 꽃들 중에서 위의 두 조건을 만족하는, 즉 3월 1일부터 11월 30일까지 매일 꽃이 한 가지 이상 피어 있도록 꽃들을 선택할 때, 선택한 꽃들의 최소 개수를 출력하는 프로그램을 작성하시오. </p>
31+
32+
### 입력
33+
34+
<p>첫째 줄에는 꽃들의 총 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 각 꽃이 피는 날짜와 지는 날짜가 주어진다. 하나의 날짜는 월과 일을 나타내는 두 숫자로 표현된다. 예를 들어서, 3 8 7 31은 꽃이 3월 8일에 피어서 7월 31일에 진다는 것을 나타낸다. </p>
35+
36+
### 출력
37+
38+
<p>첫째 줄에 선택한 꽃들의 최소 개수를 출력한다. 만약 두 조건을 만족하는 꽃들을 선택할 수 없다면 0을 출력한다.</p>
39+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
let input = require('fs').readFileSync('./dev/stdin').toString().trim().split('\n');
2+
let N = Number(input[0]);
3+
4+
let flowers = [];
5+
6+
// 레전드 저장법..
7+
for (let i = 1; i <= N; i++) {
8+
let [sm, sd, em, ed] = input[i].split(' ').map(Number);
9+
flowers.push([sm * 100 + sd, em * 100 + ed]);
10+
}
11+
12+
flowers.sort((a, b) => {
13+
if (a[0] === b[0]) return b[1] - a[1];
14+
return a[0] - b[0];
15+
});
16+
17+
let count = 0;
18+
let target = 301;
19+
let maxEnd = 0;
20+
let idx = 0;
21+
22+
while (target <= 1130) {
23+
let found = false;
24+
25+
// 시작일이 현재 목표 날짜 이하인 꽃들 중
26+
while (idx < N && flowers[idx][0] <= target) {
27+
// 가장 늦게 지는 꽃
28+
maxEnd = Math.max(maxEnd, flowers[idx][1]);
29+
idx++;
30+
found = true;
31+
}
32+
33+
// target 이하로 피는 꽃을 못찾았으면 ㅈㅈ
34+
if (!found) {
35+
return console.log(0);
36+
}
37+
38+
// 가장 늦게 지는 꽃을 발견한 것, 다음 목표 날짜를 그 꽃이 지는 날로 갱신
39+
target = maxEnd;
40+
count++;
41+
}
42+
43+
console.log(count);
44+
45+
// n이 10만인 거부터 완탐은 안됨
46+
// 시작일이 <= 3/1인 꽃 중에 끝나는 날이 가장 긴 거 선택 -> 만약 없으면 0 출력
47+
// 종료일이 >= 11/30인 것 중에 시작일이 가장 이른 거 선택 -> 만약 없으면 0 출력
48+
49+
// 뭔가 정렬을 하면 좋을 것 같은데 뾰족한 수는 없네..
50+
// 현재 시간이 t 일때 시작일이 t보다 같거나 작은 것 중에 종료일이 가장 긴 걸 선택하는게 유리하다.
51+
// 시작일과 끝일을 전역변수로 두고 계속 갱신하면 어떨까?
52+
53+
// 만약 끝 일이 ~2/28 이면 continue -> 필요 없음
54+
// end가 11/30보다 크거나 같으면 return cnt -> 끝
55+
// 지금 끝일이 end보다 짧거나 같아 -> 필요 없음 (이 아래로는 end가 더 큼)
56+
// 지금 시작일이 end보다 2일이상 커 -> 0 출력
57+
// 지금 시작일이 end보다 작거나 같아 -> count ++;, start 갱신 end 갱신
58+
59+
// 60분 싸웠다..[ 2, 28, 4, 25 ],[ 4, 12, 6, 5 ], [ 6, 3, 6, 15 ],[ 6, 15, 9, 27 ],[ 9, 14, 12, 24 ],
60+
61+
// 40분 더 박고 포기
62+
// 이게 M,D 둘다 If else로 풀려니까 걍 답이 없음
63+
// 현재 시간이 t 일때 시작일이 t보다 같거나 작은 것 중에 종료일이 가장 긴 걸 선택하는게 유리하다.
64+
// 이건 딱 맞았는데 날짜를 하나의 숫자로 합치는 아이디어까지 필요했음..

0 commit comments

Comments
 (0)