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를 반환하세요.
a | b | result |
---|---|---|
5 | 24 | "TUE" |
문제를 보고 가장 먼저 떠올랐던 모듈은 datetime 모듈이였습니다.
2016년이란 상수와 a, b라는 변수로 우리는 연/월/일을 모두 알 수 있습니다.
datetime(년, 월, 일)을 넣으면 자동으로 연-월-일 시:분:초
형태로 나타납니다.
여기서 strftime
이라는 함수로 가공을 하면 해당 기간에 맞는 요일까지 알아서 계산해서 String형태로 반환해줍니다.
예를들어 datetime(2016, 1, 25).strftime('%Y%M%D%a')
을 찍어보면 20160001/25/16Mon
이란 반환값이 나옵니다. 중간에 월이 좀 이상하긴 하지만 괜찮습니다. 필요한건 뒤에 잘 붙어있는 'Mon'이니까요.
다음 strftime
으로 가공한 문자열을 filter
함수를 통해 필터링을 해줍니다. filter
함수는 filter('함수식', '데이터')
형태를 써서 함수식에 True에 속하는 값들만 filter-object형태로 반환해주는 함수입니다.
함수식에서 문자열에서 문자만 찾아내는 isalpha()함수를 활용합니다.
이를 문자열로 변환시켜줘야되서 str.join을 활용합니다.
마지막으로 문제에서 원하는 답은 Mon이 아닌 MON같은 대문자형태이므로 .uppder함수를 써서 대문자로 치환해줍니다.
그래서 나온 코드는 이렇습니다.
from datetime import datetime
def solution(a, b):
answer = datetime(2016, a, b).strftime('%Y%M%D%a')
return ''.join(filter(lambda x: x.isalpha(), answer)).upper()
2줄짜리 간결한 코드지만 함수가 무려 5개나 쓰여있습니다.😆
추상화나 파이써닉한 관점에서 나쁘지않게 풀이한 것 같지만, 문제를 보는 사람 입장에서는 다소 복잡한 접근법으로 보이는 것이 아쉽습니다.
import datetime
def getDayName(a,b):
t = 'MON TUE WED THU FRI SAT SUN'.split()
return t[datetime.datetime(2016, a, b).weekday()]
t = [MON, TUE, WED, THU, FRI, SAT, SUN]
해도되는데 왜 굳이 split을 썼는지는 모르겠지만 datetime의 또다른 메서드인 weekday()를 사용한 풀이방식입니다.
weekday()는 해당 날짜에 요일에 맞는 index를 반환해주는 함수입니다.
월요일이면 0 일요일이면 6이 됩니다.
그러므로 t[index]하면 자동으로 매칭되게 됩니다.
깔끔하네요 😎