728x90

문제) 11월 11일에는 농업인의 날, 가래떡 데이, 보행자의 날, 대한민국 해군 창설 기념일, 유엔참전용사 추모의 날, 빼빼로 데이 등 다양한 의미를 가진 날이다. 성현이는 11월 11일의 11일 전은 10월 31일, 즉 할로윈 데이라는 것을 깨달았고, 다음 할로윈 데이 때 친구에게 빼빼로를 받아낼 계획을 세우고 있다. 성현이는 문득 11월 11일처럼 m 월 m 일의 m 일 전이 또 다른 기념일인 m 이 있는지 궁금해졌다. m 월 m 일의 m 일 전의 날짜를 구하는 프로그램을 만들어보자. 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지 있으며, 2월은 평년에는 28일, 윤년에는 29일까지 있다. 윤년이란, 연도가 100의 배수를 제외한 4의 배수이거나 400의 배수인 해를 의미한다.

 

입력) 첫째 줄에 계산해야 하는 날짜의 수 T 가 주어진다. (1 ≤ T ≤ 1212) 둘째 줄부터 T 개의 줄에 날짜가 한 줄에 하나씩 주어진다. 날짜는 연도와 달을 의미하는 yi , mi 가 공백으로 구분되어 주어진다. (2000 ≤ yi ≤ 2100, 1 ≤ mi ≤12)

 

출력)  T 개의 줄에 걸쳐 정답을 출력한다.  i 번째 줄에 yi 년 mi 월 mi 일의 mi 일 전 날짜를 연, 월, 일 순으로 공백으로 구분해서 출력한다.

from sys import stdin

def leap_year(year):
    return (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0)

days30 = [4, 6, 9, 11]

for _ in range(int(input())):
    result = []
    year, month = map(int, stdin.readline().rstrip().split())

    if month == 1: month = 13

    if month == 13: result.append(str(year-1))
    else: result.append(str(year))

    if month -1 == 2: result += ['2', str(28 + int(leap_year(year)))]
    elif month - 1 in days30: result += [str(month - 1), '30']
    else: result += [str(month - 1), '31']

    print(' '.join(result))

풀이 : 우선 년도를 입력으로 하고 출력으로 윤년의 여부를 알려주는 함수를 정의한다. 그 후 30일 까지만 있는 달들을 담고있는 리스트를 정의해준다. 만약 입력 월이 1월 이라면 13으로 변경해주고 result값에 (입력년도 - 1) 을 저장해준다. 그 후 (입력월 - 1) 이 2월이라면 윤년의 여부를 판단하여 결과값을 저장해 주고 그게 아니라면 조건에 맞는 결과값을 저장해준다. 마지막으로 공백을 구분자로 가지게 하면서 결과값을 출력해준다.

+ Recent posts