[Level 1] 2016년 (Python)

Date:    Updated:

카테고리:

문제 설명

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일같은 날짜는 주어지지 않습니다)

입출력 예

a b result
5 24 “TUE”

나의 풀이

일단 문제를 읽고나서 월별로 최대 몇일까지 있는지 확인하였다. 확인해보니 월별 일수가 29,31,30일 등 뒤죽박죽 이어서 규칙을 찾을수 없었다. 그래서 list로 선언하여 사용하기로 했다. 그 뒤 1월부터 파라미터로 주어지는 a(월) 의 직전 월까지 모든 일 수를 다 더하고 b(일) 값을 더한 뒤 7(요일 갯수)로 나누는 식으로 진행했다. 요일도 리스트로 선언해 사용한다.

  • 월별 일 수를 list로 저장
  • 요일 별 문자열을 list로 저장
    • 문항에서 1월 1일이 금요일이라고 하였으니 금요일 부터 차례대로 리스트에 저장
  • 1월부터 파라미터로 받은 a(월)의 직전 월까지의 모든 일수를 다 더함
    • ex) a = 5 인경우, 1월 부터 4월까지 모든 일 수를 다 더함
  • 그 뒤 두번째 파라미터로 받은 b(일)을 추가로 더 해줌.
  • 모두 더한값에 7로 나눈 나머지 값을 요일 리스트 인덱스에 활용
    • 7 = 요일의 갯수
def solution(a, b):
    days_of_the_week = ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU']
    days_per_months = [31,29,31,30,31,30,31,31,30,31,30,31]
    return days_of_the_week[((sum(days_per_months[:a-1]) + b) % 7) - 1]

다른 사람의 풀이

import datetime
def solution(a,b):
    t = 'MON TUE WED THU FRI SAT SUN'.split()
    return t[datetime.datetime(2016, a, b).weekday()]
  • 내장 모듈인 datetime을 활용하여 풀이
  • datetime은 날짜와 시간을 다루는데 활용하기 좋은 함수들을 제공함
  • datetime.datetime(year, month, day).weekday()는 파라미터로 받은 year, month, day에 해당하는 요일을 인덱스 값으로 반환.
    • 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일

다른사람들의 풀이를 보면 정말 매번 놀라는것 같다. 요일을 반환하는 내장 함수라니.. 문제를 풀기전에 관련 내장함수가 존재하는지 찾아보는것도 괜찮을것 같다.

댓글남기기