코딩테스트

[프로그래머스] 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을 뺐던 코드도 %로 수정했다.