코딩 테스트 연습/[프로그래머스] Python

[LV.3] 연습문제 > 2016년

duswjd_data 2025. 7. 23. 09:18

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12901

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명

  • 2016년 1월 1일은 금요일일 때, 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 반환
  • 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT
    예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환
  • 제한 조건
    2016년은 윤년 → 2월은 29일까지
    2016년 a월 b일은 실제로 있는 날 (13월 26일이나 2월 45일같은 날짜는 주어지지 않음)

정답 코드

def solution(a, b):
    # 각 월별 일수 (윤년이므로 2월은 29일)
    days_in_month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    # 요일 리스트 (2016년 1월 1일은 금요일)
    week = ["FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"]
    
    # 1월 1일부터 a월 b일까지의 총 일수 계산
    total_days = sum(days_in_month[:a-1]) + b - 1
    
    # 총 일수를 7로 나눈 나머지에 해당하는 요일 반환
    return week[total_days % 7]

코드 설명

  1. week 리스트 : 계산의 편의를 위해 "FRI"부터 시작
  2. total_days 계산 :
    • sum(month_days[:a-1]): 입력받은 a월 이전까지의 모든 달의 날짜 수 더하기
    • + b: 현재 달의 날짜 b를 더하기
    • - 1: 1월 1일을 기준으로 계산하기 때문에 1 빼기
  3. 요일 반환 :
    • total_days % 7: 총 일수를 7로 나눈 나머지 (0부터 6까지의 값을 가지며, day_of_week 리스트의 인덱스 역할)
    • day_of_week[...]: 계산된 인덱스에 해당하는 요일을 리스트에서 찾아 반환

첫 번째 시도 (정답, 개선 필요)

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

 

  • 불필요한 괄호 줄이기
  • 직관적인 날짜 계산: b-1을 직접 사용하는 방식으로 코드의 가독성을 높이기