알고리즘/백준
[Silver IV] 유통기한 - 26083 (python)
KimMinGyun
2024. 7. 5. 06:32
많은 조건 분기, 구현
자취 11년 차 한별이는 슬슬 냉장고에 있는 음식들의 유통기한이 지나지 않았을지 걱정이다. 그러나 유통기한으로 적혀 있는 날짜의 연도/월/일 순서를 알 수 없어서 고민하고 있다.
날짜를 표기하는 방법은 국가에 따라 다르며, 크게 세 가지 방법이 있다.
- 연도/월/일: 대한민국, 일본, 중국, 리투아니아, 몽골, 부탄, 헝가리 등 동아시아권 국가
- 일/월/연도: 그리스, 네덜란드, 덴마크, 독일, 러시아, 말레이시아, 멕시코, 방글라데시, 베트남, 불가리아, 사우디아라비아, 아르헨티나, 아이슬란드, 이집트, 이스라엘, 이탈리아, 인도네시아, 체코, 칠레, 콜롬비아, 태국, 포르투갈 등 대부분의 국가
- 월/일/연도: 미국, 괌, 필리핀 등 일부 영어권 국가
따라서 예를 들어 10/12/32라는 날짜는
- 일/월/연도로 해석할 경우2032년 12월 10일
- 월/일/연도로 해석할 경우 2032년 10월 12일
중 하나가 된다. 12월 32일이라는 날짜는 없으므로 적어도 연도/월/일 형식(2010년 12월 32일)은 아니라는 것을 알 수 있다.
한별이는 냉장고 음식들의 유통기한을 보고 세 가지 방법 중 유효한 날짜로 해석 가능한 어떤 형식으로 해석해도 음식이 안전한지 알고 싶다. 한별이를 도와 음식이 안전한지 판단하는 프로그램을 작성해 보자.
첫 번째 줄에 오늘 날짜를 나타내는 정수 Y, M, D가 공백으로 구분되어 주어진다. 이는 오늘이 (2000+Y)년 M𝑀월 D𝐷일이라는 것을 의미한다. (0≤Y≤99, (2000+Y)년 M월 D일은 올바른 날짜)
다음 줄에는 냉장고의 음식의 개수 N이 주어진다. (1≤N≤300000)
다음 N개의 줄에는 각 줄마다 음식의 유통기한을 나타내는 정수 A, B, C가 공백으로 구분되어 주어진다. 음식에는 유통기한이 A/B/C의 형식으로 적혀 있다. (0≤A,B,C≤99)
모든 날짜는 2000년에서 2099년 사이이며, 연도는 100으로 나눈 나머지만이 주어진다.
각 날짜마다 한 줄에 하나씩 다음 중 한 가지를 출력한다.
- invalid: 어떤 형식으로 해석해도 올바르지 않은 날짜인 경우
- safe: 해석 가능한 모든 형식에 대해 오늘 날짜가 유통기한보다 이전이거나 같은 날일 경우
- unsafe: 나머지 경우
코드
import sys
input = sys.stdin.readline
def deadline_check(y, m, d):
if today > (y, m, d):
return "unsafe"
return "safe"
md = [[0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
[0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]]
today = tuple(map(int, input().split()))
n = int(input())
for _ in range(n):
deadline = list(map(int, input().split()))
ans = 'invalid'
# 연도/월/일, 일/월/연도, 일/연도/월 조합에 대해 검사
for i, j, k in [(0, 1, 2), (2, 1, 0), (2, 0, 1)]:
yy = deadline[i]
mm = deadline[j]
dd = deadline[k]
# 유효한 날짜인지 확인
if 1 <= mm <= 12 and 1 <= dd <= md[1 if yy%4 else 0][mm]:
ans = deadline_check(yy, mm, dd)
if ans == 'unsafe':
break
print(ans)