Post

[백준] 2457 파이썬

문제


  • 백준 2457 (골드 3)

백준 2457

3월 1일부터 11월 30일까지 꽃이 항상 피어 있어야 하지만 전체 꽃의 개수는 가장 적어야 하는 문제였다.
날짜 문제여서 달마다 다른 일수를 어떻게 저장해두어야 하나 고민하였는데 굳이 저장할 필요가 없어보였다.
단순 구현으로 풀 수 있는 문제처럼 보여서 시도해보았다.

image

내 코드


처음에는 이중 반복문을 통해서 구현을 하였는데 완성된 코드를 보니 한번의 반복문으로 풀 수 있을 것 같아서 수정하였다.
start에서 mid 사이에 피는 꽃들 중에서 가장 오래 피는 꽃을 찾아서 해당 꽃을 선택하고 start와 mid를 적절하게 초기화 해주는 방식으로 나아가도록 설계하였다.
11월 30일까지 꽃이 피어있어야 하므로 선택한 꽃의 지는 날짜가 12월이라면 답을 출력하고 종료되도록 하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import sys
input = sys.stdin.readline

n = int(input())
flowers = [list(map(int, input().split())) for _ in range(n)]
start = [0, 0]
mid = [3, 1]
ans = 0

flowers.sort()

temp = [0, 0, 0, 0]
for flower in flowers:
    if flower[0] > mid[0] or (flower[0] == mid[0] and flower[1] > mid[1]):
        if temp == [0, 0, 0, 0]:
            print(0)
            exit()
        ans += 1
        start = mid
        mid = [temp[2], temp[3]]
        if temp[2] == 12:
            print(ans)
            exit()
        temp = [0, 0, 0, 0]

    if flower[0] < start[0] or (flower[0] == start[0] and flower[1] < start[1]):
        continue
    
    if flower[2] > temp[2] or (flower[2] == temp[2] and flower[3] > temp[3]):
        if not (flower[0] > mid[0] or (flower[0] == mid[0] and flower[1] > mid[1])):
            temp = flower

    if temp[2] == 12:
            ans += 1
            print(ans)
            exit()

print(0)

image

중간에 조건이 두번씩 나오는 부분들을 적절하게 리팩토링할 수 있을 거 같아 시도해 봐야겠다.

This post is licensed under CC BY 4.0 by the author.