https://www.acmicpc.net/problem/2457
2457번: 공주님의 정원
첫째 줄에는 꽃들의 총 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 각 꽃이 피는 날짜와 지는 날짜가 주어진다. 하나의 날짜는 월과 일을 나타내는 두 숫자로 표현된다. 예를 들어서,
www.acmicpc.net
3월 1일을 포함하는 날짜를 가진 꽃 중에 지는 날이 제일 먼 꽃을 선택하여 그 꽃이 지는 날을 다시 시작날짜로 놓고, 이 과정을 반복해서 시작 날짜가 11월 30일보다 커지면 ans를 출력한다.
비교를 쉽게 하기 위해 날짜를 숫자로 변환한다 ex) 3월 1일 = 301, 11월 30일 = 1130
또한 정렬을 통해 O(N)시간 안에 탐색이 가능하도록 한다.
꽃 배열을 돌다가 꽃의 피는 날짜가 현재의 피는날짜보다 커지는 경우 즉, 절대로 현재의 피는 날짜를 포함할 수 없는 경우에 ans를 하나 증가시키고 현재의 피는 날짜를 갱신한다. 중간에 피는날짜가 1130보다 커지면 바로 종료한다.
for 문을 모두 돈 후에 업데이트가 안될 수 있으므로 마지막으로 한 번 더 점검한다.
4%에서 계속 틀려서 멘붕오던 와중 질문에 데이터 추가 부분에 있는 반례를 보고 문제점을 깨닳았다. 처음에는 현재의 피는날짜를 포함하지 않는 꽃이 나오면 바로 갱신했는데, 꽃의 피는 날짜가 현재의 피는날짜보다 작다면 그 이후에 나오는 꽃이 현재의 피는 날짜를 포함할 가능성이 있기 때문에 그것까지 탐색해보아야 했다.
오래 걸렸지만 그래도 내 힘으로 풀어서 뿌듯하다,, 하하,,
import sys
input = sys.stdin.readline
N = int(input())
flower = []
for _ in range(N):
a, b, c, d = map(int, input().split())
flower.append([a*100+b, c*100+d])
flower.sort()
ans = 0
days = [301, 1130]
month, day = 0, 0
#print(flower)
for i in range(N):
if (flower[i][0] <= days[0] < flower[i][1]):
day = max(day,flower[i][1]) #지는날
elif (flower[i][0] > days[0]):
ans += 1
days[0] = day
day = 0
if (flower[i][0] <= days[0] < flower[i][1]):
day = flower[i][1]
#print(days, i)
if (days[0]>days[1]):
print(ans)
sys.exit(0)
if (day>days[1]):
ans+=1
print(ans)
else:
print(0)
'알고리즘💻 > 그리디' 카테고리의 다른 글
BOJ 18921번: Cost of Subtree (0) | 2021.08.18 |
---|---|
BOJ 2450번: 모양 정돈 (0) | 2021.08.04 |
BOJ 2180번: 소방서의 고민 (0) | 2021.08.04 |
BOJ 13305번: 주유소 (0) | 2021.08.03 |
BOJ 2437번: 저울 (0) | 2021.07.19 |