2016년

신연우·2021년 2월 5일
0

알고리즘

목록 보기
28/58
post-thumbnail

프로그래머스 - 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일같은 날짜는 주어지지 않습니다)

풀이

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

해결 과정

결국 요일은 7개까지밖에 없기 때문에 7로 나눴을 때 나머지를 가지고 요일을 판별할 수 있을 것이라 생각했다. 실제로 1월 1일이 금요일이라면 1월 8일, 1월 15일도 금요일이 된다.

다만, 달이 1월만 있는 것이 아니라는 점에 유의해야 한다. 2월부터 12월의 경우는 결국 1월 1일로부터 며칠이 지났는지를 일일이 일수로 계산을 한 다음 그 수를 7로 나눠야 한다.

그래서, 각 달의 최대 일수를 저장하는 배열과 요일에 해당하는 문자열을 저장하는 배열을 만든다.

이후, a 바로 이전 달까지의 날 수를 전부 더한다. 이러면 a - 1월의 마지막 날이 1월 1일로부터 며칠이 지났는지를 계산한 결과가 담겨있을 것이다.

여기에 일수를 저장하고 있는 b를 더해주면 ab일이 1월 1일로부터 며칠이 흘렀는지를 계산할 수 있다.

이 값을 7로 나눴을 때의 나머지를 통해 요일을 판별할 수 있다.

다른 사람의 풀이

import datetime


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

2016년에 실제로 있던 날을 반환하기 때문에 datetime 라이브러리의 힘을 빌려 해당 날짜의 실제 요일을 구할 수도 있다.

profile
남들과 함께하기 위해서는 혼자 나아갈 수 있는 힘이 있어야 한다.

0개의 댓글