코딩테스트
[프로그래머스] 2016년 (Python)
til_t
2021. 3. 27. 01:18
시도 1
def solution(a, b):
answer = ''
month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
days = ["SUN","MON","TUE","WED","THU","FRI","SAT"]
start_days = ["FRI", "MON", "TUE", "FRI", "SUN", "WED", "FRI", "MON", "THU", "SAT", "TUE", "THU"]
n = b % 7
start_day = days.index(start_days[a - 1])
index = start_day + (n - 1)
if index >= 7:
index = index - 7
answer = days[index]
return answer
단순 캘린더를 보고 한달의 마지막 요일에 다음달의 첫 번째 요일이 연달아 이어지는 것만 보고 각 달의 첫 번째 요일을 그냥 다 구해버렸고, 그걸 리스트로 만들어서 해당 요일을 구했다.
테스트 케이스는 다 통과했지만, 아무리 생각해도 각 월의 해당 요일을 일일이 구하는 것이 수고스러워보여서(더 생각하지 못하고) 각 월의 첫날의 요일을 구하는 과정을 코드로 짰다.
시도 2
def solution(a, b):
answer = ''
month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
days = ["SUN","MON","TUE","WED","THU","FRI","SAT"]
start_days = ["FRI"]
for i in range(a):
month_start_day = days.index(start_days[-1])
if month[i] == 31:
plus_day = 3
elif month[i] == 30:
plus_day = 2
else:
plus_day = 1
month_index = month_start_day + plus_day
if month_index >= 7:
month_index = month_index - 7
start_days.append(days[month_index])
# 31이면 3번 째 요일, 30이면 2번째 후, 29면 1번째 후 요일에 끝남
n = b % 7
start_day = days.index(start_days[a - 1])
index = start_day + (n - 1)
if index >= 7:
index = index - 7
answer = days[index]
return answer
이것도 테스트케이스는 통과했으나... 역시 복잡하고 이상했다.
다른 사람들이 풀이한 것을 보고 나서 다시 달력을 보니 생각해보면 그냥 해당 년의 1월의 첫 요일만 알면 해결된다.
시도 3 (최종)
def solution(a, b):
answer = ''
month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
days = ["SUN","MON","TUE","WED","THU","FRI","SAT"]
if a > 1:
for i in range(a - 1):
b += month[i]
n = b % 7
start_day = 5
index = start_day + (n - 1)
answer = days[index % 7]
return answer
원하는 달의 전 달(1월 제외)의 일수를 전부 더한 값에 b를 더한 후 7로 나눈 후 나머지로 요일을 알 수 있으니 말이다.
테트리스처럼 각 월의 마지막 요일은 다음 달의 첫 요일과 이어진다는 사실을 다시 생각해보면 윗줄과 같은 결과를 알 수 있었다.
index가 7을 넘어가면 7을 뺐던 코드도 %로 수정했다.