본문 바로가기
파이썬/파이썬 알고리즘

파이썬 프로그래머스 level 1. 2016년

by Go! Jake 2021. 5. 4.

- 다음 글: 파이썬 프로그래머스 level 1. 체육복

  문제

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):
    week = ["FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"]
    month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    month_sum = []
    for idx, value in enumerate(month):
        if idx == 0:
            month_sum.append(month[0])
        else:
            month_sum.append(month_sum[idx - 1] + month[idx])


    if a-1==0:
        answer = week[(0 + b - 1) % 7]
    else:
        answer = week[(month_sum[a - 2] + b - 1) % 7]
    return answer

해당 문제는 1월 1일 금요일을 기점으로 날짜에 대한 절댓값을 가지고, 이를 7로 나눈 나머지로 요일을 알아내는 문제이다. 따라서 '월'은 '일'을 29일, 30일 또는 31일을 담고 있는 정보가 되고, 월과 일에 대한 값을 포함한 전체 값에서 나머지로 요일을 도출한다.

 

<1>

def solution(a, b):
    week = ["FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"]
    month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    month_sum = []

a,b - a는 달, b는 일이 된다.

week - 요일을 도출할 리스트. index 계산을 통해 요일을 도출한다.

month - 날짜 전체의 값을 도출할 때 사용되는 값들. 각 달에 대한 일자 정보를 입력한다.

*일자에 대한 정보는 입력값 그대로 사용하면 된다.

 

<2>

    for idx, value in enumerate(month):
        if idx == 0:
            month_sum.append(month[0])
        else:
            month_sum.append(month_sum[idx - 1] + month[idx])

우리가 필요한 것은 최종 계산 시에 '현재 일자까지의 총합'을 7로 나눈 나머지를 구하는 것이다.

각 월별로 예를 들어 3월 24일 계산할 때는 1,2월의 합과 24일을 더하는 개념이므로, 누적된 값에 대한 리스트를 구한다.

 

for idx, value in enumerate(month): enumerate()함수로 index와 해당 요소의 값을 구한다.

    if idx == 0: 
        month_sum.append(month[0]) 첫 달인 경우 1월만 입력한다.
    else:
        month_sum.append(month_sum[idx - 1] + month[idx]) 1월이 아닌 경우 해당 월과 이전까지 누적된 월을 더한다.

 

<3>

    if a-1==0:
        answer = week[(b - 1) % 7]
    else:
        answer = week[(month_sum[a - 2] + b - 1) % 7]
    return answer

    if a-1==0:
        answer = week[(b - 1) % 7] ㅇ날짜 입력은 index 0 이 아닌 1부터 시작된 값이 입력되므로 기본 b-1을 사용한다. if는 1월일 때 사용.

    else:
        answer = week[(month_sum[a - 2] + b - 1) % 7]
 월의 총합은 이전달것까지 더한다. 예를 들어, 3월 26일이면 month_sum의 2월분을 더하면 이전 달까지의 총합의 값을 이용하고 여기에 26일을 더해 현재 날짜까지의 총합을 사용할 수 있다.

입력 값이 1에서부터 시작하므로 a-1을 기본으로 사용하고, 이전 달 값을 사용할 것이기 때문에 a-2를 사용한다. 일자 값은 위와 같이 b-1로 사용한다.

 

- 다음 글: 파이썬 프로그래머스 level 1. 가운데 글자 가져오기

 

댓글