2019년 1월 12일 토요일

#3 알고리즘 연습- 요일찾기/PYTHON

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일같은 날짜는 주어지지 않습니다)

입출력 예

a
b
result
5
24
TUE



문제풀이 IDEA

2016년(2016년은 윤년이다)의 각 월별 일수를 더해서 반복문을 통해 몇일째인지 구한다
(ex. 4월 19일 이면 1월 일수 + 2월 일수 + 3월 일수 + 19일) 
그리고 1주일의 단위인 7로 나눈 mod(나머지)값으로 요일을 대응시켜준다



나의 코드⭐ (module을 쓰면 좀더 편하게 풀수 있겠지만 함수 작성을 한번 해보았습니다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def solution(a, b):
    sumday = {}    #월별 일수를 기록하기 위한 dictionary 만들기
    flus = b       #flus는 총합 일수를 나타내는 변수인데 a월 b일에서
                    b일을 바로 기록하고 월별 일수만 더해주면 되므로 초기화를
                    b로 해준다
    dayofweek = ["THU","FRI","SAT","SUN","MON","TUE","WED"] #1월 1일 기준 총합 일수는 1인데
                                                             7로 나눈 나머지는 1이고 
                                                             1월 1일 이므로 index1에 금요일이 오도록 list작성

    for i in range(1,13):      #i는 월을 나타내고 이를 key값으로 쓴다
        if i == 2:             #2월은 예외적으로 28일이 오므로 걸러준다
            sumday[i]=29        그런데 윤년이므로 29를 value값으로 넣어준다
        elif i< 8:             #월별 일수를 적어보면 8월 이전에는
            if i % 2 ==0:      #짝수 월에는
                sumday[i]=30                 30일까지 있고
            else:              #홀수 월에는 
                sumday[i]=31                 31일까지 있다.
        else:                  #8월 부터 12월까지는
            if i % 2 == 0:     #반대로 짝수월에
                sumday[i]=31                 31일까지
            else:              #홀수 월에
                sumday[i]=30                 30일까지 있다.
    for i in range(1,a):       #그리고 1 <= x   < a 인 월 범위안에서 key값을 가져오고
            flus += sumday[i]    sumday[i]로 value값을 flus에 누적해가며 더해준다
    return dayofweek[flus % 7] #위에 저장해놓은 요일 list에서 나머지값index에 대응되는 요일을 가져온다


다른 코드⭐

1
2
3
4
5
6
7
8
9
10
# 문제가 개편 되었습니다. 이로 인해 함수 구성이 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
# 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
def getDayName(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]    #sum메서드를 이용해 months list의 0번째 부터 a-2번째 index까지의 갑을 더해준다
                                               예를 들어 2월 4일 이라고 하면 1월까지의 일수를 더해주고 나머지 4일을 더해줘야하는데
                                               이때 1월은 0번째 index이고 입력받은 2와 2차이가 나므로 slice를 :a-1까지로 해줫다
                                               
                                               #그리고 남은 잔여일을 더해주는데 이때 요일이 들어가있는 day list의 0번째 인덱스가
                                                FRI이므로 b-1을 해줬다(1월 1일이 금요일이랬으니까)
                                                만약 +b를 해주고자 한다면 days list의 첫째 원소로 THU가 오고 한칸씩 밀리면 된다
#아래 코드는 테스트를 위한 출력 코드입니다.
print(getDayName(5,24))




특별이 어려웠던 개념은 없기때문에 사용한 SYNTAX는 따로 적지 않겠습니당

출처 : 프로그래머스(https://programmers.co.kr)

댓글 없음:

댓글 쓰기

가장 많이 본 글