관리 메뉴

커리까지

[프로그래머스] 2016년 본문

알고리즘/풀이

[프로그래머스] 2016년

목표는 커리 2022. 7. 4. 21:19
728x90
SMALL

문제 설명

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"

제출 답안

  • 평소보다 조금 많이 고민했던 문제
  1. 7일로 나눈 나머지를 기준으로 요일을 배정한다.
    1. 금요일이 첫 번째 요일이니 1 % 7 = 1이므로 1로 두고 뒤에 날짜들을 설정한다.
  2. 윤년이니 2월만 29일로 두고 나머지는 기존의 개월에 따라 일수를 부여한다.
  3. 시작일은 0으로 설정한다.
  4. 만약 i 가 입력 받은 월과 같다면 b를 아니면 month 에서 해당 월에 맞는 일수를 7로 나눠 나머지를 저장한다.
  5. 시작일을 기준으로 요일을 찾아야 하기에 시작일에 나머지 일수를 더하고 다시 7로 나눈다.
    1. 2월로 달이 넘어갔을 경우 1월 마지막 일과 2월의 요일에 맞는 일수를 더하고 나누어야지만 다시 로테이션이 돌아서 찾을 수 있다.
    2. 예를 들어 1월 마지막 요일의 값이 6이고 2월의 일수 29일을 7로 나눈 나머지 2를 더하면 8이므로 7일이 넘었으므로 금요일이 지난거다.
    3. 그래서 7로 나눠서 다시 1로 맞춘다.
  6. days 에서 start_day 에 맞는 요일을 찾아서 반환하면 된다.
def solution(a, b):
    # 1
    days= {3: 'SUN', 4: "MON", 5: "TUE", 6: "WED", 0: "THU", 1: "FRI", 2: "SAT"}
    # 2
    month = {1: 31, 2: 29, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}
    # 3
    start_day = 0
    for i in range(1, a + 1):
        # 4
        day = (b if i == a else month[i]) % 7
        # 5
        start_day = (start_day + day) % 7
    # 6
    answer = days[start_day]
    return answer
728x90
LIST
Comments