코딩 테스트/Python

[프로그래머스 코딩테스트 연습] 16. 2016년

알밤바 2022. 3. 17. 09:00
728x90
반응형
 

코딩테스트 연습 - 2016년

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까

programmers.co.kr


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"를 반환하세요.

 

2) 제한 조건

  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

 

3) 입출력 예

 


1. 문제 접근방식

월 별로 나누는 것이 아닌 전체 일자(days)로 환산을 한다.

요일은 7씩 반복되기에 환산된 전체 일자를 7로 나눈 후 그에 맞는 요일을 출력한다.

 

2. 풀이 코드

def solution(a, b):
    
    month = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)   # 1월 ~ 12월의 전체 일 개수
    weekday = ('FRI', 'SAT', "SUN", "MON", "TUE", 'WED', 'THU')  # 1월 1일이 금요일이니 금요일부터 시작
    
    days = sum(month[:a-1]) + b-1      # 5월일 경우, 4월까지의 일 갯수 + 5월의 나머지 일 개수
    answer = weekday[days % 7]         # 전체 일 개수를 7로 나눈 나머지를 인덱스로 활용하여 요일 출력
    
    return answer

월 별 일자 개수(month)요일(weekday)를 튜플 또는 리스트로 만들어준다.

특히, 요일(weekday)의 경우, 2016년 1월 1일이 금요일이므로 금요일부터 시작한다.

 

전체 일자(days)는 a = 5인 경우, 4월까지의 일자 개수를 구한 후 5월의 나머지 일자 개수를 구하여 더한다.

그렇게 구한 전체 일자(days)를 7로 나누고 나온 나머지를 요일(weekday)의 인덱스로 활용하여 그에 맞는 요일을 출력한다. 

 

from datetime import date

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

또 다른 방법은 'datetime' 라이브러리를 사용하는 방법이다.

 

datetime.datetime(YEAR, MONTH, DAY)

weekday()는 정수를 요일로 반환을 한다. (월 : 0, 화 : 1 , ... , 일 : 6)

정수로 반환된 값을 date의 인덱스로 활용하여 요일을 출력하는 방법이다.

 

3. 배운 점

우선 month와 weekday를 튜플 또는 리스트로 따로 만들어준다는 것이다.

이렇게 만들고 나니 각 일자를 합하는 것과 인덱싱까지 쉬워진다는 것을 알게 되었다.

 

또한 datetime 라이브러리를 사용하는 방법도 알게 되었다.

이번에 datathon을 진행하고, 캐글 코드를 리뷰하면서 종종 볼 수 있는 라이브러리였는데 이렇게 쓰일 수 있다는 것을 한 번 더 알게 되었다. 날짜가 나올 때, 한번 써먹을 수 있지 않을까~?

 



728x90
반응형