2020. 4. 19. 17:50

[python](프로그래머스)2016년

문제 설명


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를 반환하세요.

 

제한 조건


  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

 

문제 풀이


  1. 파이썬의 날짜 라이브러리인 datetime을 사용한다.
  2. 2016년에만 한정하고 있으므로 datetime으로 날짜 정보를 2016년 a월 b일의 날짜를 받아 dt라는 변수에 저장한다.
  3. weekday 함수를 이용해서 dt의 요일 정보를 가져온다. 이때 weekday함수는 요일을 int값으로 반환한다.(0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일)
  4. int값으로 반환하는 것을 이용해서 배열 역시 같은 순서로 0번째부터 6번째까지 채워 넣는다.
  5. 해당하는 배열의 인덱스를 담아 리턴해준다.
import datetime

def solution(a, b):
    week_array = ["MON","TUE","WED","THU","FRI","SAT","SUN"]
    dt = datetime.datetime(2016, a, b)
    week_num = dt.weekday()
    answer = week_array[week_num]
    return answer

 

다른 풀이


import datetime

def getDayName(a,b):
    t = 'MON TUE WED THU FRI SAT SUN'.split()
    return t[datetime.datetime(2016, a, b).weekday()]

나랑 같은 풀이 방식이지만 조금 더 간략화한 버전

def getDayName(a,b):
    months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    days = ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU']
    return days[(sum(months[:a-1])+b-1)%7]

라이브러리를 쓰지 않고 2016년에 31인 달 29일인달 30일인 달과 요일을 배열로 선언해준 뒤 해당하는 날짜를 7로 나눈 나머지 값을 요일의 배열 인덱스 값으로 리턴한다.