[Silver III] 유통기한 - 26083

문제 링크

성능 요약

메모리: 120948 KB, 시간: 508 ms

분류

구현, 많은 조건 분기

제출 일자

2025년 6월 6일 13:00:52

문제 설명

자취 $1$년 차 한별이는 슬슬 냉장고에 있는 음식들의 유통기한이 지나지 않았을지 걱정이다. 그러나 유통기한으로 적혀 있는 날짜의 연도/월/일 순서를 알 수 없어서 고민하고 있다.

날짜를 표기하는 방법은 국가에 따라 다르며, 크게 세 가지 방법이 있다.

  • 연도/월/일: 대한민국, 일본, 중국, 리투아니아, 몽골, 부탄, 헝가리 등 동아시아권 국가
  • 일/월/연도: 그리스, 네덜란드, 덴마크, 독일, 러시아, 말레이시아, 멕시코, 방글라데시, 베트남, 불가리아, 사우디아라비아, 아르헨티나, 아이슬란드, 이집트, 이스라엘, 이탈리아, 인도네시아, 체코, 칠레, 콜롬비아, 태국, 포르투갈 등 대부분의 국가
  • 월/일/연도: 미국, 괌, 필리핀 등 일부 영어권 국가

따라서 예를 들어 10/12/32라는 날짜는

  • 일/월/연도로 해석할 경우 $2032$년 $12$월 $10$일
  • 월/일/연도로 해석할 경우 $2032$년 $10$월 $12$일

중 하나가 된다. $12$월 $32$일이라는 날짜는 없으므로 적어도 연도/월/일 형식($2010$년 $12$월 $32$일)은 아니라는 것을 알 수 있다.

한별이는 냉장고 음식들의 유통기한을 보고 세 가지 방법 중 유효한 날짜로 해석 가능한 어떤 형식으로 해석해도 음식이 안전한지 알고 싶다. 한별이를 도와 음식이 안전한지 판단하는 프로그램을 작성해 보자.

입력

첫 번째 줄에 오늘 날짜를 나타내는 정수 $Y$, $M$, $D$가 공백으로 구분되어 주어진다. 이는 오늘이 $\left(2000+Y\right)$년 $M$월 $D$일이라는 것을 의미한다. ($0 \le Y \le 99$, $\left(2000+Y\right)$년 $M$월 $D$일은 올바른 날짜)

다음 줄에는 냉장고의 음식의 개수 $N$이 주어진다. ($1 \le N \le 300\,000$)

다음 $N$개의 줄에는 각 줄마다 음식의 유통기한을 나타내는 정수 $A$, $B$, $C$가 공백으로 구분되어 주어진다. 음식에는 유통기한이 $A$/$B$/$C$의 형식으로 적혀 있다. ($0 \le A, B, C \le 99$)

모든 날짜는 $2000$년에서 $2099$년 사이이며, 연도는 $100$으로 나눈 나머지만이 주어진다.

출력

각 날짜마다 한 줄에 하나씩 다음 중 한 가지를 출력한다.

  • invalid: 어떤 형식으로 해석해도 올바르지 않은 날짜인 경우
  • safe: 해석 가능한 모든 형식에 대해 오늘 날짜가 유통기한보다 이전이거나 같은 날일 경우
  • unsafe: 나머지 경우

💡 해결 방법

💻 코드

# https://www.acmicpc.net/problem/26083
 
from datetime import datetime
from sys import stdin
input = stdin.readline
 
 
nowy, nowm, nowd = map(int, input().split()) 
 
today = tuple((nowy, nowm, nowd))
 
t = int(input())
 
for _ in range(t):
    a, b, c = map(int, input().split())
    tries = ((a, b, c) , (c, b, a) , (c, a, b))
    
    validdates = []
 
    for x, y, z in tries:
        try:
            datetime(2000 + x, y, z)
            validdates.append(tuple((x, y, z)))
        except:
            continue
        
    
    if len(validdates) == 0:
        print('invalid')
    elif all(today <= x for x in validdates):
        print('safe')
    else:
        print('unsafe')