본문 바로가기
문제 해결/BOJ

[백준] 공주님의 정원

by 자잘 2023. 3. 31.

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

 

2457번: 공주님의 정원

첫째 줄에는 꽃들의 총 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 각 꽃이 피는 날짜와 지는 날짜가 주어진다. 하나의 날짜는 월과 일을 나타내는 두 숫자로 표현된다. 예를 들어서,

www.acmicpc.net

그리디 문제입니다. 먼저, 각각의 꽃이 피고 지는 월, 일을 날짜로 변환하여 저장한 다음 꽃이 지는 날을 기준으로 정렬을 해줍니다. 그 다음 현재 꽃이 이전 꽃이 피기 전에 필 수 있으면 리스트에 추가해줍니다. 그 다음 기존에 선택된 꽃들을 체크하면서 현재 꽃이 포함할 수 있는 범위에 있는 꽃들은 필요가 없으므로 리스트에서 제거해주면 됩니다. 

 

import sys
INT_MAX = sys.maxsize

#sys.stdin = open("input.txt", "r")
input = sys.stdin.readline

n = int(input())

month = [0] + [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
prefix = [0] * 13

# 각 월까지의 날짜합을 미리 저장해둔다.
for i in range(1, 13):
    prefix[i] += (prefix[i - 1] + month[i])

flower = []
for _ in range(n):
    m1, d1, m2, d2 = tuple(map(int, input().split()))
    f_start = prefix[m1 - 1] + d1
    f_end = prefix[m2 - 1] + d2

    # 꽃이 시드는 날짜가 더 뒤에 있는 꽃들만 저장
    if f_end > f_start:
        flower.append((f_start, f_end))
# 1월 1일 ~ 3월 1일까지를 미리 저장해둔다.
selected = [(1, prefix[2] + 1)]
# 11월 30일
target = prefix[10] + 30

# 끝나는 날짜를 기준으로 오름차순 정렬
flower.sort(key=lambda x: x[1])

for i, (start, end) in enumerate(flower):
    last = selected[-1]
    # 선택된 마지막으로 꽃이 지는 날짜보다 현재 꽃이 피는 날짜가 더 느리면 넘어간다.
    if last[1] < start:
        continue

    while len(selected) >= 2:
        prev_of_last = selected[-2]
        # 전전에 선택된 꽃이 피고 지는 범위에 닿을 수 있으면 이전 꽃은 필요가 없다
        if prev_of_last[1] >= start:
            selected.pop()
        else:
            break

    selected.append((start, end))


if len(selected) == 1:
    print(0)
else:
    cnt = 0
    flag = False
    for start, end in selected[1:]:
        cnt += 1
        if end > target:
            flag = True
            break
    # 11월 30일에 도달하여 break한 경우에만 답을 출력
    if flag:
        print(cnt)
    else:
        print(0)

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 성곽  (0) 2023.04.02
[백준] 달이 차오른다, 가자.  (0) 2023.04.01
[백준] 세 용액  (0) 2023.03.30
[백준] 사회망 서비스(SNS)  (0) 2023.03.29
[백준] 색종이 - 3  (0) 2023.03.28