코딩테스트 연습 - 2016년
2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까
programmers.co.kr
1) 문제 설명
2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각SUN,MON,TUE,WED,THU,FRI,SAT입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.
2) 제한 조건
- 2016년은 윤년입니다.
- 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)
3) 입출력 예
1. 문제 접근방식
월 별로 나누는 것이 아닌 전체 일자(days)로 환산을 한다.
요일은 7씩 반복되기에 환산된 전체 일자를 7로 나눈 후 그에 맞는 요일을 출력한다.
2. 풀이 코드
def solution(a, b):
month = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) # 1월 ~ 12월의 전체 일 개수
weekday = ('FRI', 'SAT', "SUN", "MON", "TUE", 'WED', 'THU') # 1월 1일이 금요일이니 금요일부터 시작
days = sum(month[:a-1]) + b-1 # 5월일 경우, 4월까지의 일 갯수 + 5월의 나머지 일 개수
answer = weekday[days % 7] # 전체 일 개수를 7로 나눈 나머지를 인덱스로 활용하여 요일 출력
return answer
월 별 일자 개수(month)와 요일(weekday)를 튜플 또는 리스트로 만들어준다.
특히, 요일(weekday)의 경우, 2016년 1월 1일이 금요일이므로 금요일부터 시작한다.
전체 일자(days)는 a = 5인 경우, 4월까지의 일자 개수를 구한 후 5월의 나머지 일자 개수를 구하여 더한다.
그렇게 구한 전체 일자(days)를 7로 나누고 나온 나머지를 요일(weekday)의 인덱스로 활용하여 그에 맞는 요일을 출력한다.
from datetime import date
def solution(a, b):
date = 'MON TUE WED THU FRI SAT SUN'.split()
return date[datetime.datetime(2016, a, b).weekday()]
또 다른 방법은 'datetime' 라이브러리를 사용하는 방법이다.
datetime.datetime(YEAR, MONTH, DAY)
weekday()는 정수를 요일로 반환을 한다. (월 : 0, 화 : 1 , ... , 일 : 6)
정수로 반환된 값을 date의 인덱스로 활용하여 요일을 출력하는 방법이다.
3. 배운 점
우선 month와 weekday를 튜플 또는 리스트로 따로 만들어준다는 것이다.
이렇게 만들고 나니 각 일자를 합하는 것과 인덱싱까지 쉬워진다는 것을 알게 되었다.
또한 datetime 라이브러리를 사용하는 방법도 알게 되었다.
이번에 datathon을 진행하고, 캐글 코드를 리뷰하면서 종종 볼 수 있는 라이브러리였는데 이렇게 쓰일 수 있다는 것을 한 번 더 알게 되었다. 날짜가 나올 때, 한번 써먹을 수 있지 않을까~?
'코딩 테스트 > Python' 카테고리의 다른 글
[프로그래머스 코딩테스트 연습] 19. 문자열 내 마음대로 정렬하기 (0) | 2022.03.20 |
---|---|
[프로그래머스 코딩테스트 연습] 17. 자릿수 더하기 (0) | 2022.03.18 |
[프로그래머스 코딩테스트 연습] 15. 나누어 떨어지는 숫자 배열 (0) | 2022.03.16 |
[프로그래머스 코딩테스트 연습] 14. 문자열 다루기 기본 (0) | 2022.03.15 |
[프로그래머스 코딩테스트 연습] 13. 두 정수 사이의 합 (0) | 2022.03.14 |