[파이썬] 프로그래머스 LV1 2016년

청수동햄주먹·2023년 2월 5일
0

파이썬코딩테스트

목록 보기
8/35

프로그래머스 2016년

  • 2016년은 윤년입니다.
    윤년은 2월에 29일이 있다

import calendar

import calendar
thisdict = {
    0 : "MON",
    1 : "TUE",
    2 : "WED",
    3 : "THU",
    4 : "FRI",
    5 : "SAT",
    6 : "SUN"
}
def solution(a, b):
    return thisdict[calendar.weekday(2016, a, b)]

파이썬 calendar 공식문서

이제껏 코딩테스트 연습을 하면서 캘린더 를 써본적이 없었는데 이번 기회에 써보았다.
calendar.weekday는 숫자로 요일을 리턴해주어서 딕셔너리에 숫자로 key, 요일 이름으로 value를 설정해 주었다

다른 사람의 풀이

수작업

def solution(a,b):
    answer = ""
    if a>=2:
        b+=31
        if a>=3:
            b+=29#2월
            if a>=4:
                b+=31#3월
                if a>=5:
                    b+=30#4월
                    if a>=6:
                        b+=31#5월
                        if a>=7:
                            b+=30#6월
                            if a>=8:
                                b+=31#7월
                                if a>=9:
                                    b+=31#8월
                                    if a>=10:
                                        b+=30#9월
                                        if a>=11:
                                            b+=31#10월
                                            if a==12:
                                                b+=30#11월
    b=b%7

    if b==1:answer="FRI"
    elif b==2:answer="SAT" 
    elif b==3:answer="SUN"
    elif b==4:answer="MON"
    elif b==5:answer="TUE"
    elif b==6:answer="WED"
    else:answer="THU"
    return answer

클릭하자마자 대단한 풀이를 발견하였다.
길긴한데 빠르기도 함..ㅋㅋ 지역변수를 따로 설정해주지 않는데다가 리스트나 딕셔너리같은 object를 만들지도 않고~
a를 기준으로 b 에 달 마다 요일 수를 더해 줌

리스트 이용하기

def solution(a,b):
    months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    days = ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU']
    return days[(sum(months[:a-1])+b-1)%7]

이런 방식으로는 생각을 못했는데 배워 두기 좋은 것 같다
a는 각 달의 요일 갯수를 저장한 리스트의 인덱스로 이용.

성능 비교

            import calendar         수작업                   리스트
테스트 1 〉	통과 (0.00ms, 10.5MB)	통과 (0.00ms, 10.4MB)	통과 (0.00ms, 10.1MB)
테스트 2 〉	통과 (0.00ms, 10.6MB)	통과 (0.00ms, 10.4MB)	통과 (0.00ms, 10.2MB)
테스트 3 〉	통과 (0.00ms, 10.5MB)	통과 (0.00ms, 10.2MB)	통과 (0.00ms, 10.3MB)
테스트 4 〉	통과 (0.01ms, 10.2MB)	통과 (0.00ms, 10.4MB)	통과 (0.00ms, 10.2MB)
테스트 5 〉	통과 (0.01ms, 10.6MB)	통과 (0.00ms, 10.4MB)	통과 (0.00ms, 10.4MB)
테스트 6 〉	통과 (0.00ms, 10.3MB)	통과 (0.00ms, 10.2MB)	통과 (0.00ms, 10.1MB)
테스트 7 〉	통과 (0.01ms, 10.4MB)	통과 (0.00ms, 10.4MB)	통과 (0.00ms, 10.3MB)
테스트 8 〉	통과 (0.01ms, 10.5MB)	통과 (0.00ms, 10.3MB)	통과 (0.00ms, 10.2MB)
테스트 9 〉	통과 (0.00ms, 10.3MB)	통과 (0.00ms, 10.2MB)	통과 (0.00ms, 10.3MB)
테스트 10 〉	통과 (0.01ms, 10.3MB)	통과 (0.00ms, 10.2MB)	통과 (0.00ms, 10.2MB)
테스트 11 〉	통과 (0.01ms, 10.5MB)	통과 (0.00ms, 10.2MB)	통과 (0.00ms, 10.3MB)
테스트 12 〉	통과 (0.00ms, 10.4MB)	통과 (0.00ms, 10.1MB)	통과 (0.01ms, 10.2MB)
테스트 13 〉	통과 (0.01ms, 10.5MB)	통과 (0.00ms, 10.4MB)	통과 (0.00ms, 10.1MB)
테스트 14 〉	통과 (0.01ms, 10.4MB)	통과 (0.00ms, 10.4MB)	통과 (0.00ms, 10.1MB)

가장 마지막 방법이 짧은 시간, 적은 메모리를 이용해 수행하였다. 👏

profile
코딩과 사별까지

0개의 댓글