programming

프로그래머스 2016년 요일 구하기 퀴즈 파이썬 해설 및 풀이


by Kitle · 2020. 07. 19.



원본 문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12901

문제 설명

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


조건이 너무 명확하므로 크게 머리 쓸 필요 없이 바로 풀이 해설 가보겠습니다.
[풀이]
def solution(a, b):
yoil = ['THU', 'FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED']
month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
days = 0
if a < 2:
return yoil[b % 7]
else:
for item in range(0,a-1):
days += month[item]
days += b
return yoil[days % 7]


[해설]
요일이라는 것은 결국 월,화,수,목,금,토,일 이 반복됩니다. 고정 길이의 반복된 부분에 활용하기에 좋은것이 무엇이라고 했었죠? 바로 모듈로 연산입니다. 여기서도 역시 % 연산으로 해보겠습니다.
실제 현업에서 날짜는 이미 잘 만들어진 datetime 모듈을 import해서 쓰겠지만, 여기는 출제자의 의도에 충실하므로 날짜 계산해보겠습니다.
달력을 보면 아시겠지만 1월 1일 시작일로부터 2월이든 3월이든 정해진 날짜만큼 + 된 후 7로 나누면 그게 요일입니다.
따라서 매월 어떻게 될지 모르겠지만 여기서는 2016년 날짜를 하드코딩합니다. 범위가 2016년이 아니었다면 윤년계산등을 썼겠지만 여기서는 2016년으로 한정되므로 list에 각 월의 days를 계산합니다.
1월 1일은 금요일이므로 1 % 7 을 나누게 되면 1이 나오겠죠. 나머지가 1인 인덱스에 FRI 가위치합니다. 0이 아닌 두번째 인덱스에 금요일을 넣고 나머지를 정리하면 여기서 쓸 순서는 목,금,토,일,월,화,수 가 되겠죠.
1월의 경우 날짜 계산 필요없이 바로 7로 나누면 끝입니다.
2월 부터는 해당 월에 해당하는 날짜와 경과일을 더해 나눠줘야합니다.
예를들어 2월 10일의 경우 1월 경과일 31일 + 10일 = 41일을 7에서 나눠주면 되겠습니다.
month list에서 for 문을 활용하여 해당 경과월-1 까지 더해줍니다.
더 좋은 방법이 있을겁니다. 이것은 숙제로.
따라서 1월인 경우 날짜를 바로 7로 나누어 계산.
2월 이상인 경우 각 월 경과일 + 해당일 더하여 7로 나누어 계산.
크게 어렵지 않게 풀 수 있습니다.