ps:problems:boj:2457
공주님의 정원
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 2457 |
문제명 | 공주님의 정원 |
레벨 | 골드 4 |
분류 |
그리디 |
시간복잡도 | O(nlogn) |
인풋사이즈 | n<=100,000 |
사용한 언어 | Python |
제출기록 | 39452KB / 304ms |
최고기록 | 212ms |
해결날짜 | 2021/12/14 |
풀이
- 그리디 알고리즘
- 3월 1일에는 꽃이 피어있어야 한다. 즉, 피는날이 3월 1일 이전인 꽃들중에서 최소 한개는 선택을 해야 한다. 이때 선택하는 꽃은, 지는 날이 가장 늦은 꽃을 선택하는 것이 최적이다. 만약에 지는날이 가장 늦은 꽃조차, 3월 1일 이전에 진다면, 3월 1일에는 아무 꽃도 피어있을수 없으므로 0을 출력하고 종료. 그렇지 않고 지는날이 3월 1일 이후의 M월 D일 이라고 한다면, 이제 다시 피는 날이 M월 D일 이전인 꽃들 중에서 한개를 선택하고, 이것을 지는날이 11월 30이후인 꽃을 고르게 될때까지 반복하면 된다.
- 알고리즘은 단순하지만, 구현이 조금 까다롭다. 처음에 피는 날 순서대로 꽃을 정렬해준 다음에, 정렬된 꽃 리스트를 순회하면서, 지금 심은 꽃이 지는 날짜, 다음에 심을 꽃의 후보, 현재까지 심은 꽃 갯수를 갱신해주면 되기는 한다.
- 시간복잡도는 정렬에 O(nlogn)이 걸리고, 순회하면서 처리하는 것은 O(n)이 걸리므로, 총 O(nlogn).
코드
"""Solution code for "BOJ 2457. 공주님의 정원".
- Problem link: https://www.acmicpc.net/problem/2457
- Solution link: http://www.teferi.net/ps/problems/boj/2457
Tags: [Greedy]
"""
import sys
FIRST = (3, 1)
LAST = (11, 30)
def main():
N = int(sys.stdin.readline())
flowers = [[int(x) for x in sys.stdin.readline().split()] for _ in range(N)]
flowers.sort()
next_target = target = FIRST
flower_count = 0
for m1, d1, m2, d2 in flowers:
if (m1, d1) > next_target:
print('0')
break
elif (m1, d1) > target:
target = next_target
flower_count += 1
next_target = max(next_target, (m2, d2))
if next_target > LAST:
print(flower_count + 1)
break
else:
print('0')
if __name__ == '__main__':
main()
ps/problems/boj/2457.txt · 마지막으로 수정됨: 2021/12/14 17:15 저자 teferi
토론