관리 메뉴

솜씨좋은장씨

[BaekJoon] 1340번 : 연도 진행바 (Python) 본문

Programming/코딩 1일 1문제

[BaekJoon] 1340번 : 연도 진행바 (Python)

솜씨좋은장씨 2022. 11. 29. 12:05
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 백준의 연도 진행바 입니다.

 

1340번: 연도 진행바

평년일 때, 각 달은 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31일이 있다. 윤년에는 2월이 29일이다. 윤년은 그 해가 400으로 나누어 떨어지는 해 이거나, 4로 나누어 떨어지면서, 100으로 나누어 떨어지지

www.acmicpc.net

🧑🏻‍💻 문제 풀이

1,800년 ~ 2,600년 사이의 특정 날짜가 주어지면

해당 날짜가 해당 년도에서 얼마나 진행된 것인지 구하는 문제입니다.

datetime 을 활용하여 1번 / datetime 없이 1번 총 2번 풀어보았습니다.

먼저 두 방법 모두 입력 받은 날짜를 파싱하여 월, 일, 년, 시간, 분 으로 분리하는 작업을 진행하였습니다.

# May 10, 1981 00:31
month, dd, year, hh_mm = year_time.split()
year, day = int(year), int(dd[:-1])
hour, minute = list(map(int, hh_mm.split(":")))
# -> month : May
# -> day : 10
# -> year : 1981
# -> hour : 00
# -> minute : 31

여기서 얻은 월에 대한 문자열을 숫자로 바꾸어주는 함수를 만들어주었습니다.

def convert_month_str_to_num(month_str):
    month_dict = {
        "January": 1, "February": 2, "March":3, "April": 4, "May": 5, "June": 6,
        "July": 7, "August": 8, "September": 9, "October": 10, "November": 11, "December": 12
    }
    
    return month_dict[month_str]
    
# May -> 5

이 다음부터는 이제 풀이 방식이 달라집니다.

🧑🏻‍💻  Datetime 사용 버전

먼저 datetime 을 사용하는 버전입니다.

from datetime import datetime

datetime 을 import 한 다음 

아까 파싱한 값을 활용하여 datetime 객체를 만들고

datetime 객체끼리 계산하여 나온 timedelta 값을 활용하였습니다.

2022.01.19 - [Programming/Python] - [Python] datetime의 strptime을 활용하여 시간과 시간 사이의 차이 구하는 방법

 

[Python] datetime의 strptime을 활용하여 시간과 시간 사이의 차이 구하는 방법

개발을 하다 보면 종종 특정 시간과 특정 시간 사이에 얼마나 많은 시간이 흘렀는지 구해야 할 경우가 있습니다. 직접 시간을 계산하는 코드를 작성해도 되지만 2시 39분 -> 5시 25분 까지 얼마나

somjang.tistory.com

total_year_datetime = datetime(year=year, month=12, day=31) - datetime(year=year-1, month=12, day=31)
input_year_datetime = datetime(year=year, month=month, day=day, hour=hour, minute=minute) - datetime(year=year, month=1, day=1)

total_year_minute = total_year_datetime.days * 24 * 60
input_year_minute = input_year_datetime.days * 24 * 60 + input_year_datetime.seconds // 60

계산하면 나오는 timedelta 값에서 days 값과 seconds 값을 활용하여 전체 분을 구하였습니다.

input_year_minute / total_year_minute * 100

정답은 위와 같이 계산하였습니다.

🧑🏻‍💻  Datetime 사용 하지 않는 버전

datetime 객체를 사용할때에는 윤년을 고려하지 않아도 알아서 잘 계산이 되었지만!

datetime 객체를 사용하지 않을때에는 윤년을 고려해야합니다.

2021.06.11 - [Programming/코딩 1일 1문제] - [BaekJoon] 2753번 : 윤년 (Python)

 

[BaekJoon] 2753번 : 윤년 (Python)

코딩 1일 1문제! 오늘의 문제는 백준의 윤년 입니다. 2753번: 윤년 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐

somjang.tistory.com

윤년인지 아닌지를 확인하는 방법은 이전에 풀었던 문제를 참고하였습니다.

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

해당 방법으로 윤년인지 아닌지 체크하는 함수를 하나 만들어주었습니다.

def get_total_day_count(year, month=0, day=0):
    month_day_list = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    total_day = sum(month_day_list)
    
    if month != 0 and day != 0:
        total_day = total_day - sum(month_day_list[month-1:]) + day - 1
    
    if check_leap_year_or_not(year=year) and (month > 2 or month == 0):
        total_day += 1
        
    return total_day

또 입력받은 정보를 바탕으로 입력받은 날짜까지의 총 일수를 구하는 함수를 만들어주었습니다.

윤년이면서 3월 이상인 경우에는 2월이 29일이므로 +1 일을 해주었습니다.

def get_total_minute_from_day(total_day, hour, minute):
    return total_day * 24 * 60 + hour * 60 + minute

전체 일수로 전체 분을 구하는 함수를 만들어주었습니다.

def year_progress_bar(year_time):
    month, dd, year, hh_mm = year_time.split()
    year, day = int(year), int(dd[:-1])
    hour, minute = list(map(int, hh_mm.split(":")))
    
    month = convert_month_str_to_num(month_str=month)
    
    total_year_day = get_total_day_count(year=year)
    
    total_day = get_total_day_count(year=year, month=month, day=day)
    
    total_year_minute = get_total_minute_from_day(
        total_day=total_year_day, hour=0, minute=0
    )
    
    total_minute = get_total_minute_from_day(
        total_day=total_day, hour=hour, minute=minute
    )
    
    return (total_minute / total_year_minute) * 100

위 함수들을 활용하여 정답을 구하였습니다.

 

전체 코드는 아래를 참고해주세요.

🧑🏻‍💻 코드 ( Solution ) - Datetime 사용 버전

from datetime import datetime


def convert_month_str_to_num(month_str):
    month_dict = {
        "January": 1, "February": 2, "March":3, "April": 4, "May": 5, "June": 6,
        "July": 7, "August": 8, "September": 9, "October": 10, "November": 11, "December": 12
    }
    
    return month_dict[month_str]    


def year_progress_bar(year_time):
    month, dd, year, hh_mm = year_time.split()
    year, day = int(year), int(dd[:-1])
    hour, minute = list(map(int, hh_mm.split(":")))
    
    month = convert_month_str_to_num(month_str=month)
    
    total_year_datetime = datetime(year=year, month=12, day=31) - datetime(year=year-1, month=12, day=31)
    input_year_datetime = datetime(year=year, month=month, day=day, hour=hour, minute=minute) - datetime(year=year, month=1, day=1)
    
    total_year_minute = total_year_datetime.days * 24 * 60
    input_year_minute = input_year_datetime.days * 24 * 60 + input_year_datetime.seconds // 60
    
    return input_year_minute / total_year_minute * 100


if __name__ == "__main__":
    year_time = input()
    print(year_progress_bar(year_time=year_time))

🧑🏻‍💻 코드 ( Solution ) - Datetime 사용하지 않는 버전

def convert_month_str_to_num(month_str):
    month_dict = {
        "January": 1, "February": 2, "March":3, "April": 4, "May": 5, "June": 6,
        "July": 7, "August": 8, "September": 9, "October": 10, "November": 11, "December": 12
    }
    
    return month_dict[month_str]    


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


def get_total_day_count(year, month=0, day=0):
    month_day_list = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    total_day = sum(month_day_list)
    
    if month != 0 and day != 0:
        total_day = total_day - sum(month_day_list[month-1:]) + day - 1
    
    if check_leap_year_or_not(year=year) and (month > 2 or month == 0):
        total_day += 1
        
    return total_day


def get_total_minute_from_day(total_day, hour, minute):
    return total_day * 24 * 60 + hour * 60 + minute


def year_progress_bar(year_time):
    month, dd, year, hh_mm = year_time.split()
    year, day = int(year), int(dd[:-1])
    hour, minute = list(map(int, hh_mm.split(":")))
    
    month = convert_month_str_to_num(month_str=month)
    
    total_year_day = get_total_day_count(year=year)
    
    total_day = get_total_day_count(year=year, month=month, day=day)
    
    total_year_minute = get_total_minute_from_day(
        total_day=total_year_day, hour=0, minute=0
    )
    
    total_minute = get_total_minute_from_day(
        total_day=total_day, hour=hour, minute=minute
    )
    
    return (total_minute / total_year_minute) * 100


if __name__ == "__main__":
    year_time = input()
    print(year_progress_bar(year_time=year_time))
 

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