소소한 컴퓨터 이야기

2016년

by Cori

문제

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. Me

def solution(a, b):
    answer = ''
    day_count = 0 
    DATE = ['FRI','SAT','SUN','MON','TUE','WED','THU']
    
    # 매 달마다 들어있는 요일 개수
    days_m = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if a == 1:
        day_count = b 
    # a = 2 -> 31(days_m[0]) + b 
    # a = 3 -> 31(days_m[0]) + 29(days_m[1]) + b 
    else:
        for i in range(1, a): # 1 2 -> 0 1 
            day_count += days_m[i-1] 
        day_count += b 
    # print((day_count-1) % 7)
    # day_count - 1 = 1 -> SAT, day_count - 1 = 2 -> SUN 
    return DATE[(day_count - 1) % 7]

우선 윤년에 대해 어렴풋이 알고있는 개념을 확실히 하기 위해 윤년에 대해 찾아보았다. 찾아보니, 윤년은 4로 나누어 떨어지는 년도이며, 그 해가 윤년인 경우 2월에 29일까지 존재한다 (1년 =366일). 윤년에 대해 어느정도 알았으니, 코드를 구상해 보았다. 1월 1일이 '금요일'이라 하였으므로 '금요일'부터 시작하는 요일 리스트를 만들고, 각 달의 요일 개수를 담고있는 리스트를 만듬. 이후 입력받은 월, 일과 1월 1일까지의 요일 차이수를 7로 나눈 나머지를 날짜 리스트의 인덱스로 활용하여, 요일을 구했다. 

 

* 그 해가 4로 나누어 떨어지나 100으로도 나누어지는 경우에는 평년이라 하며, 4와 100으로도 나누어 떨어지나 400으로 나누어

  떨어지는 경우에는 다시 윤년으로 계산한다.. 일단 윤년의 경우는 2월이 하루 더 있다고 알고 있으면 될 듯 ! 

 

2. Others

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]

months와 days 배열을 생각한 것 까지는 나와 똑같은데, 이후 코드를 나보다 훨씬 간결하게 작성하였다. months[:0] 일 경우 -> 빈 리스트를 반환한다 !! 그래서 sum(months[:0])을 하게 되면 0이 반환되고, 나처럼 a=1인 경우를 따로 구분하지 않고서도 리스트 슬라이싱을 이용하여 간결하게 작성할 수 있던 것 .. 

 

* months[ : 0] -> [] 반환, months[ : 1] -> [31] 반환 .. 알아두자 !

import datetime

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

datetime 모듈을 사용하여 작성한 코드로, 모듈 활용의 좋은 예시라서 가져왔다. datetime.datetime().weekday() 함수를 활용하면, 정수로 요일을 반환(월요일 = 0, 일요일 = 6)한다.

'CS > Coding Test' 카테고리의 다른 글

체육복  (0) 2021.08.22
예산  (0) 2021.08.22
가운데 글자 가져오기  (0) 2021.08.22
같은 숫자는 싫어  (0) 2021.08.22
나누어 떨어지는 숫자 배열  (0) 2021.08.22

블로그의 정보

코딩하는 오리

Cori

활동하기