2 분 소요

1. 문제

https://www.acmicpc.net/problem/2457

  • 그리디 문제
// 문제
오늘은 공주님이 태어난 경사스러운 날이다. 
왕은  날을 기념하기 위해  꽃이 피어있는 작은 정원을 만들기로 결정했다.

 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일까지만 있다.)

이러한 N개의 꽃들 중에서 다음의  조건을 만족하는 꽃들을 선택하고 싶다.

공주가 가장 좋아하는 계절인 3 1일부터 11 30일까지 
매일 꽃이  가지 이상 피어 있도록 한다.
정원이 넓지 않으므로 정원에 심는 꽃들의 수를 가능한 적게 한다. 
N개의 꽃들 중에서 위의  조건을 만족하는, 
 3 1일부터 11 30일까지 매일 꽃이  가지 이상 피어 있도록 꽃들을 선택할 , 
선택한 꽃들의 최소 개수를 출력하는 프로그램을 작성하시오. 

// 입력
첫째 줄에는 꽃들의  개수 N (1  N  100,000) 주어진다. 
다음 N개의 줄에는  꽃이 피는 날짜와 지는 날짜가 주어진다. 
하나의 날짜는 월과 일을 나타내는  숫자로 표현된다. 
예를 들어서, 3 8 7 31 꽃이 3 8일에 피어서 7 31일에 진다는 것을 나타낸다. 

// 출력
첫째 줄에 선택한 꽃들의 최소 개수를 출력한다. 
만약  조건을 만족하는 꽃들을 선택할  없다면 0 출력한다.

// 예제 입력 1 
4
1 1 5 31
1 1 6 30
5 15 8 31
6 10 12 10

// 예제 출력 1 
2

// 예제 입력 2 
10
2 15 3 23
4 12 6 5
5 2 5 31
9 14 12 24
6 15 9 3
6 3 6 15
2 28 4 25
6 15 9 27
10 5 12 31
7 14 9 1

// 예제 출력 2 
5


2. 핵심 아이디어


3. Python 문제풀이

import sys
input = sys.stdin.readline

n = int(input())
date = []

for _ in range(n) :
  tmp = list(map(int, input().split()))
  date.append([tmp[0] * 100 + tmp[1], tmp[2] * 100 + tmp[3]])

date.sort(key = lambda x : (x[0], x[1]))
cnt = 0
end = 0
target = 301

while date :
  if target >= 1201 or target < date[0][0] :
    break
  for _ in range(len(date)) :
    if target >= date[0][0] :
      if end <= date[0][1] :
        end = date[0][1]
      date.remove(date[0])
    else:
      break

  target = end
  cnt += 1

if target < 1201 :
  print(0)
else :
  print(cnt)


4. Java 문제풀이


댓글남기기