관리 메뉴

솜씨좋은장씨

[BaekJoon] 2730번 : 오늘은 OS 숙제 제출일 (Python) 본문

Programming/코딩 1일 1문제

[BaekJoon] 2730번 : 오늘은 OS 숙제 제출일 (Python)

솜씨좋은장씨 2022. 5. 2. 11:26
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 백준의 오늘은 OS 숙제 제출일 입니다.

 

2730번: 오늘은 OS 숙제 제출일

택희는 OS조교이다. 이번 숙제는 간단히 pintos가 동작하는 화면을 캡쳐한 다음에, 이를 프린트해서 제출하는 것이다. 학생들은 보고서에 자기 학번, 이름과 제출한 날짜를 간단하게 써서 내면 된

www.acmicpc.net

👨🏻‍💻 문제 풀이

와~! 쉬운문제다~! 하고 풀기 시작했다가 몇가지 디테일들을 놓쳐 계속 틀렸던 문제였습니다.

💡 놓쳤던 디테일 들

- 1월과 12월

- 윤년 고려

- 정답 속 DAY 의 복수형 - 차이나는 날짜가 1일 이면 DAY / 2일 이상이면 DAYS

💡 1월과 12월 반영

def is_need_check_next_year(submission_month, deadline_month, submission_year):
    is_need_check = False
    deadline_year = submission_year
    if submission_month == 12 and deadline_month == 1:
        is_need_check = True
        deadline_year += 1
    elif submission_month == 1 and deadline_month == 12:
        is_need_check = True
        deadline_year -= 1
        
    return is_need_check, deadline_year

💡 윤년 고려

def is_leap_year(year):
    is_leap = False
    
    if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
        is_leap = True
        
    return is_leap
    
    
def calculate_date_term(submission_month, submission_day, submission_year, 
                        deadline_month, deadline_day):
    
    is_submission_year_leap = is_leap_year(submission_year)

    is_need_check, deadline_year = is_need_check_next_year(submission_month, deadline_month, submission_year)
    
    if not is_submission_year_leap:				 |
        if deadline_month == 2 and deadline_day == 29:		 | - 이 부분
            deadline_year = 2004				 |
    
    submission_day = datetime(year=submission_year, month=submission_month, day=submission_day)
    deadline_day = datetime(year=deadline_year, month=deadline_month, day=deadline_day)

    term = (deadline_day - submission_day).days
    
    return term, submission_day, deadline_day

💡 정답 속 DAY 의 복수형 - 차이나는 날짜가 1일 이면 DAY / 2일 이상이면 DAYS

day_status = f"{datetime_to_string(deadline_day)} IS {term} {'DAYS' if term > 1 else 'DAY'} AFTER"
day_status = f"{datetime_to_string(deadline_day)} IS {abs(term)} {'DAYS' if abs(term) > 1 else 'DAY'} PRIOR"

🤩 datetime -> 문자열 날짜에서 0제거

def datetime_to_string(date):
    return '{dt.month}/{dt.day}/{dt.year}'.format(dt=date)

👨🏻‍💻 코드 ( Solution )

from datetime import datetime

def is_need_check_next_year(submission_month, deadline_month, submission_year):
    is_need_check = False
    deadline_year = submission_year
    if submission_month == 12 and deadline_month == 1:
        is_need_check = True
        deadline_year += 1
    elif submission_month == 1 and deadline_month == 12:
        is_need_check = True
        deadline_year -= 1
        
    return is_need_check, deadline_year


def is_leap_year(year):
    is_leap = False
    
    if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
        is_leap = True
        
    return is_leap


def datetime_to_string(date):
    return '{dt.month}/{dt.day}/{dt.year}'.format(dt=date)


def is_grade_homework(term, submission_day, deadline_day):
    day_status = "SAME DAY"
    if term < -7 or term > 7:
        day_status = "OUT OF RANGE"
    elif 0 < term < 8:
        day_status = f"{datetime_to_string(deadline_day)} IS {term} {'DAYS' if term > 1 else 'DAY'} AFTER"
    elif -8 < term < 0:
        day_status = f"{datetime_to_string(deadline_day)} IS {abs(term)} {'DAYS' if abs(term) > 1 else 'DAY'} PRIOR"
        
    return day_status


def calculate_date_term(submission_month, submission_day, submission_year, 
                        deadline_month, deadline_day):
    
    is_submission_year_leap = is_leap_year(submission_year)

    is_need_check, deadline_year = is_need_check_next_year(submission_month, deadline_month, submission_year)
    
    if not is_submission_year_leap:
        if deadline_month == 2 and deadline_day == 29:
            deadline_year = 2004
    
    submission_day = datetime(year=submission_year, month=submission_month, day=submission_day)
    deadline_day = datetime(year=deadline_year, month=deadline_month, day=deadline_day)

    term = (deadline_day - submission_day).days
    
    return term, submission_day, deadline_day


def os_homework_submission_date(submission_date, deadline):
    submission_month, submission_day, submission_year = map(int, submission_date.split("/"))
    deadline_month, deadline_day = map(int, deadline.split("/"))
    
    term, submission_day, deadline_day = calculate_date_term(submission_month, submission_day, submission_year,deadline_month, deadline_day)
    
    return is_grade_homework(term, submission_day, deadline_day)


if __name__ == "__main__":
    for _ in range(int(input())):
        submission_date, deadline = input().split()
        print(os_homework_submission_date(submission_date, deadline))
 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

 

Comments