ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 2016년 (Python)
    코딩테스트 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을 뺐던 코드도 %로 수정했다.

    댓글

Designed by Tistory.