본문 바로가기

코드업 문제집 파이썬 if~else 1214 : 이 달은 며칠까지 있을까?

관리하수달 2026. 9. 6.

[문제]

철수와 영희는 한 사람이 특정 월(month)을 지목하면 나머지 사람이 그 달의 마지막 날이 며칠인지 알아맞히는 게임을 하였다. 두 사람 모두 처음엔 서툴렀지만 게임을 계속하다 보니 금방 익숙해졌다. 그래서 게임의 규칙을 조금 어렵게 바꿔 연도와 월을 말하면 그 달의 마지막 날이 며칠인지 알아맞히기로 하였다.

 

이 규칙이 어려운 이유는 2월이 윤달이 있기 때문이다.

2월이 29일인 해를 윤년이라고 하는데, 윤년의 판단은 아래 두 조건 중 하나만 만족하면 된다.

 

- 조건 1 : 400의 배수인 해는 모두 윤년이다.

- 조건 2 : 4의 배수인 해들 중 100의 배수가 아닌 해들은 모두 윤년이다.

 

연도와 월을 알고 있을 때 그 달의 마지막 날을 구하는 프로그램을 작성하시오.

 

<참고> 월별 마지막 날

1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
31 28/29 31 30 31 30 31 31 30 31 30 31

 

[문제해설]

연도와 월을 입력받아 그 달이 며칠까지 있는지 출력한다.

각 달의 마지막 날은 다음과 같다.

  • 1, 3, 5, 7, 8, 10, 12월 → 31일
  • 4, 6, 9, 11월 → 30일
  • 2월 → 평년 28일, 윤년 29일

윤년은

  • 400의 배수이거나
  • 4의 배수이면서 100의 배수가 아닌 경우

이다.

[문제풀이 1 - if문으로 월 하나씩 확인]

연도와 월 입력

입력받은 월을 하나씩 확인

2월이면 윤년인지 추가로 확인

해당 달의 일수 출력

year, month = map(int, input().split())

if month == 1:
    print(31)

elif month == 2:
    if year % 400 == 0:
        print(29)
    elif year % 100 == 0:
        print(28)
    elif year % 4 == 0:
        print(29)
    else:
        print(28)

elif month == 3:
    print(31)
elif month == 4:
    print(30)
elif month == 5:
    print(31)
elif month == 6:
    print(30)
elif month == 7:
    print(31)
elif month == 8:
    print(31)
elif month == 9:
    print(30)
elif month == 10:
    print(31)
elif month == 11:
    print(30)
elif month == 12:
    print(31)

조건을 그대로 하나씩 작성한 방법이다.

코드는 길지만 처음 문제를 풀 때는 월마다 어떤 값이 출력되는지 가장 직관적으로 확인할 수 있다.


[문제풀이 2 - or로 같은 일수의 월 묶기]

31일까지 있는 월과 30일까지 있는 월을 각각 or로 묶는다.

31일인 월 확인

해당하면 31 출력

30일인 월 확인

해당하면 30 출력

나머지는 2월이므로 윤년 확인

[사용된 개념 설명]

or : 여러 조건 중 하나라도 참이면 참

month == 1 or month == 3 or month == 5

month가 1, 3, 5 중 하나라면 참이 된다.

year, month = map(int, input().split())

if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12:
    print(31)

elif month == 4 or month == 6 or month == 9 or month == 11:
    print(30)

else:
    if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
        print(29)
    else:
        print(28)

월을 하나씩 따로 작성하는 것보다 짧아졌지만, 같은 비교를 여러 번 작성해야 한다.


[문제풀이 3 - in으로 같은 일수의 월 묶기]

or로 길게 작성했던 조건을 in으로 더 간단하게 표현할 수 있다.

2월

윤년 확인 → 28일 또는 29일

1, 3, 5, 7, 8, 10, 12월

31일

나머지

30일

[사용된 개념 설명]

in : 값이 리스트 안에 포함되어 있는지 확인

month in [1, 3, 5, 7, 8, 10, 12]

month가 리스트 안에 있으면 참이 된다.

year, month = map(int, input().split())

if month == 2:
    if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
        print(29)
    else:
        print(28)

elif month in [1, 3, 5, 7, 8, 10, 12]:
    print(31)

else:
    print(30)

or로 같은 조건을 여러 번 작성하지 않아도 돼서 코드가 더 깔끔해진다.


[문제풀이 4 - 각 달의 일수를 리스트에 저장]

각 달의 일수를 순서대로 리스트에 저장한다.

월 입력

month - 1을 리스트의 위치로 사용

해당 위치의 일수 출력

단, 2월이 윤년이라면 28을 29로 변경한다.

[사용된 개념 설명]

리스트의 위치는 0부터 시작한다.

days[0] → 1월
days[1] → 2월
days[2] → 3월

따라서 입력받은 월을 그대로 사용할 수 없고 month - 1을 사용한다.

year, month = map(int, input().split())

days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

if month == 2 and (year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)):
    days[1] = 29

print(days[month - 1])

처음에는 월을 하나씩 확인하는 방식으로 풀 수 있고, 같은 일수의 월을 or로 묶으면 코드가 줄어든다.

여기서 in을 사용하면 조건을 더 간단하게 만들 수 있고, 리스트를 사용하면 각 달의 일수를 미리 저장해 필요한 값만 꺼낼 수도 있다.

같은 문제를 if → or → in → 리스트 순서로 줄여보면서 조건문과 리스트 활용법을 익히기 좋은 문제였다.

댓글