코드업 문제집 파이썬 if~else 1214 : 이 달은 며칠까지 있을까?
[문제]
철수와 영희는 한 사람이 특정 월(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 → 리스트 순서로 줄여보면서 조건문과 리스트 활용법을 익히기 좋은 문제였다.
'코딩공부 > 코드업 파이썬' 카테고리의 다른 글
| 코드업 문제집 파이썬 if~else 1212 : 삼각형의 성립 조건 (0) | 2026.09.06 |
|---|---|
| 코드업 문제집 파이썬 if~else 1205 : 최댓값 (0) | 2026.09.06 |
| 코드업 문제집 파이썬 if~else 1180 : 만능 휴지통 (0) | 2026.09.02 |
| 코드업 문제집 파이썬 if~else 1173 : 30분전 (0) | 2026.09.02 |
| 코드업 문제집 파이썬 if ~else 1167 : 두 번째 수 (0) | 2026.08.29 |
댓글