본문 바로가기

Computer Science/알고리즘

[Programmers] Level1 - 2016년(연습문제) Python 풀이

728x90
반응형

문제

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

풀이

이 문제는 2016년 1월 1일 시작요일과 1년이 366일인 윤년을 사용하여 문제를 풀이하면 쉽게 해결할 수 있다.

  1. 가장 먼저 월요일부터 일요일까지 값을 day변수에 list형식으로 선언한다.
    여기서 1월 1일 시작이 금요일이라는 힌트를 사용하여 선언시 'FRI'을 0번에 넣어 금, 토, 일, 월, 화, 수, 목 순으로 day값에 선언한다.
  2. 매월의 마지막 일수를 month변수에 list형식으로 선언한다.
  3. python의 슬라이싱을 이용하여 값을 구한다.

해당 문제는 윤년이라는 부분에서 힌트를 얻었지만 슬라이싱을 사용하여 값을 구하는 과정에서 Level 1이지만 굉장히 오래 걸린 문제였다.


번외로 파이썬에서는 datetime 라이브러리를 사용하여 풀이를 진행 할 수 있다.
해당 라이브러리를 사용하면 한줄로 풀이를 할 수 있다.

코드

# 윤년인 경우 1년이 366일
# a: 1~12 b: 1~31
def solution(a, b):
    # 1월 1일 시작이 금요일
    day = ['FRI','SAT','SUN','MON','TUE','WED','THU']
    month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

    result = sum(month[:a-1]) + b-1

    return day[result % 7]

datetime라이브러리를 사용한 경우

def solution(a, b):
    day = 'MON TUE WED THU FRI SAT SUN'.split()
    return day[datetime.datetime(2016, a, b).weekday()]
728x90
반응형