https://programmers.co.kr/learn/courses/30/lessons/12901
프로그래머스에서 '2016년'이라는 연습 문제를 풀었다.
이는 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일같은 날짜는 주어지지 않습니다)
datetime을 사용한 풀이
문제를 보자마자 datetime 모듈을 사용하면 되겠다는 생각을 했다.
그래서 딕셔너리로 월, 일을 만든 후 datetime을 이용해 간단하게 코드를 완성했다.
import datetime
def solution(a, b):
dic = {0:'MON', 1:'TUE', 2:'WED', 3:'THU', 4:'FRI', 5:'SAT', 6:'SUN'}
date = datetime.datetime(2016,a,b).weekday()
return dic[date]
datetime 모듈은 알아두면 정말 유용하게 쓰이는데,
여기선 요일을 구해야하므로 datetime에 있는 weekday() 모듈을 사용했다.
해당 코드로 테스트케이스도 통과했고 효율성 문제도 통과해서 그대로 제출하려고 했는데 종종 코테에서 모듈을 사용하지 못하게 한다는 말을 들은 것 같아서 datetime 모듈을 사용하지 않고 어떻게 할 수 있을지 고민을 해 보았다.
datetime을 사용하지 않은 풀이
1월 1일부터 날짜를 전부 더해 요일을 구하면 될 것 같아서 딕셔너리에 월과 해당 월이 30일까지인지 31일까지인지 정보를 넣은 후 요일에 해당하는 새로운 리스트를 만들었다.
def solution(a, b):
answer = ''
dic = {
1 : 31, 2 : 29, 3 : 31, 4 : 30, 5 : 31, 6 : 30, 7 : 31, 8 : 31, 9 : 30, 10 : 31, 11 : 30, 12: 31
}
day = ["FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"]
count = 0
#1월일 때
if a == 1 :
count = b -1
answer = day[count%7]
#1월 아닐 때
else :
for i in range(1, a) :
count += dic[i]
count = count + b -1
answer = day[count%7]
return answer
만약 a가 1월이라면 b로 들어온 날짜를 7로 나누어서 요일을 구하면 되기에 if 문으로 1월일 때와 아닐 때를 구분했다.
count에 b-1을 한 이유는 day 리스트의 인덱스는 0부터 시작하는 것도 있고 7로 나누었을 때 나올 수 있는 나머지에 7 이상인 수는 없기 때문이다.
a가 1월이 아니라 2월이라면 1월에서 부터 날짜를 전부 더하여 7로 나눈 나머지로 요일을 구하도록 했다.
해당 코드 역시 테스트 케이스를 모두 통과했으며 효율성도 통과했다.