프로그래머스 LV1 2016년 (연습문제)

프로그래머스 LV1 2016년 (연습문제)

2021, Apr 02    

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

입출력 예

a b result
5 24 “TUE”

해당 월에 몇일까지 있는지 아는 법

먼저 주먹을 쥔다. 그리고 검지튀어나온 부분부터 시작해서 센다. 그러면 새끼 손가락부분까지 7월이 된다.

그 다음에 다시 새끼 손가락부터 시작한다. 그럼 중지 튀어나온 부분이 12월이 된다.

튀어나온 부분은 31일까지고 들어간 부분은 30일까지이다. 2월은 28일까지이고, 2월 29일은 그레고리력으로 60번째(윤년에만 있다.) 날이다.


파이썬을 사용해서 해당 월이 총 몇일인지 알아내는 법

calendar.monthrange(year,month)를 사용한다.
tuple로 (1일이 무슨 요일인지, 총 몇일)를 리턴한다.

import calendar
calendar.monthrange(2021,4)

>>>(3, 30)

Signature: calendar.monthrange(year, month)
Docstring:
Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for year, month.
0~6까지 월요일부터 일요일이다.


풀이

# 요일을 리턴한다. 1/1은 금요일, 윤년 = 366일. 2월 29일까지 있음.

# a 는 월, b는 일.  a는 12까지 있고 b는 30, 31일까지 있다. 1월은 31일까지 있고 2월이 29, 3월이 31일까지. 4월이 30일

# if a가 짝수 = 30일 근데 예외로 2월은 29까지만. 

# 1/1일이 금요일이면 

# 2016년 이다.

def solution(a, b):
#     answer = ''
    months = {1:31, 2:29, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12: 31}
    days = {1:"FRI", 2:"SAT", 3:"SUN", 4:"MON", 5:"TUE", 6:"WED", 0:"THU"}
    sum_days = 0
    iter_months = list(range(1, a))
    for month in iter_months:
        sum_days += months.get(month)
    count_day = sum_days + b
    count_day = count_day % 7
    answer = days.get(count_day)
    return answer

if __name__ == "__main__":
    a, b = 5, 24 # result = "TUE"
    print(solution(a,b))```

>>>TUE
# 다른 사람 풀이 1 함수활용의 좋은 예

import datetime

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


#아래 코드는 테스트를 위한 출력 코드입니다.
print(getDayName(5,24))

>>>TUE

위 코드에서 재밌는 점
.split() 함수
datetime.datetime().weekday(): weekday()함수는 월요일이 0부터 시작.

# 다른 사람 풀이2 함수활용의 좋은 예

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]

#아래 코드는 테스트를 위한 출력 코드입니다.
print(getDayName(5,24))

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges