일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- programmers
- Real or Not? NLP with Disaster Tweets
- PYTHON
- 프로그래머스
- 금융문자분석경진대회
- 코로나19
- SW Expert Academy
- 자연어처리
- Docker
- 파이썬
- ChatGPT
- Baekjoon
- gs25
- 프로그래머스 파이썬
- ubuntu
- dacon
- AI 경진대회
- Kaggle
- Git
- 우분투
- github
- 맥북
- 편스토랑
- 캐치카페
- 편스토랑 우승상품
- leetcode
- hackerrank
- 더현대서울 맛집
- 데이콘
- 백준
- Today
- Total
솜씨좋은장씨
[BaekJoon] 1340번 : 연도 진행바 (Python) 본문
코딩 1일 1문제! 오늘의 문제는 백준의 연도 진행바 입니다.
🧑🏻💻 문제 풀이
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을 활용하여 시간과 시간 사이의 차이 구하는 방법
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)
윤년인지 아닌지를 확인하는 방법은 이전에 풀었던 문제를 참고하였습니다.
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))
'Programming > 코딩 1일 1문제' 카테고리의 다른 글
[BaekJoon] 14495번 : 피보나치 비스무리한 수열 (Python) (0) | 2022.12.01 |
---|---|
[BaekJoon] 18408번 : 3 つの整数 (Three Integers) (Python) (0) | 2022.11.30 |
[BaekJoon] 18398번 : HOMWRK (Python) (0) | 2022.11.28 |
[BaekJoon] 25955번 : APC는 쉬운 난이도 순일까, 아닐까? (Python) (0) | 2022.11.27 |
[BaekJoon] 24389번 : 2의 보수 (Python) (0) | 2022.11.26 |