코드 분석
이 코드는 사용자가 입력한 연도와 월을 바탕으로 그 달이 며칠까지 있는지 계산하는 프로그램입니다.
day31=[1,3,5,7,8,10,12]
day30=[4,6,9,11]
year=int(input('연도 입력: '))
month=int(input('월 입력: '))
if month < 1 or month > 12:
print('존재하지 않는 월!!')
result = '00'
elif month in day31:
result = 31
elif month in day30:
result = 30
elif year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
result = 29
else:
result = 28
print(f'{year}년 {month}월은 {result}까지 입니다.')
1. 초기 변수 설정
- day31=[1,3,5,7,8,10,12] : 31일까지 있는 월을 리스트로 만듭니다.
- day30=[4,6,9,11] : 30일까지 있는 월을 리스트로 만듭니다.
2. 사용자 입력
- year=int(input('연도 입력: ')) : 사용자에게 연도를 입력받아 int() 함수를 사용하여 정수형으로 변환한 후 year 변수에 저장합니다.
- month=int(input('월 입력: ')) : 사용자에게 월을 입력받아 정수형으로 변환한 후 month 변수에 저장합니다.
3. 조건문(if-elif-else)을 이용한 날짜 계산
- if month < 1 or month > 12: : 먼저 입력된 month가 1보다 작거나 12보다 큰지 확인합니다. 이 조건에 해당하면 존재하지 않는 월이므로 '존재하지 않는 월!!'이라는 메시지를 출력하고, result에 '00'을 할당합니다.
- elif month in day31: : 앞선 조건이 거짓일 경우, month가 day31 리스트 안에 있는지 확인합니다. 만약 있다면 result에 31을 할당합니다.
- elif month in day30: : 위의 조건들이 모두 거짓일 경우, month가 day30 리스트 안에 있는지 확인합니다. 만약 있다면 result에 30을 할당합니다.
- elif year % 4 == 0 and year % 100 != 0 or year % 400 == 0: : 앞선 조건들이 모두 거짓일 경우, 이 달은 2월이라는 의미입니다. 여기서는 윤년인지 아닌지를 판단합니다.
- 윤년의 조건: 4로 나누어 떨어지면서( year % 4 == 0 ) 100으로는 나누어 떨어지지 않거나( year % 100 != 0 ), 400으로 나누어 떨어지는( year % 400 == 0 ) 해가 윤년입니다. 이 조건이 참이면 2월은 29일까지이므로 result에 29를 할당합니다.
- else: : 위의 모든 조건이 거짓일 경우, 해당 월(2월)은 윤년이 아니라는 의미이므로 result에 28을 할당합니다.
4. 결과 출력
- print(f'{year}년 {month}월은 {result}까지 입니다.') : 마지막으로 F-string을 사용하여 최종 결과를 출력합니다. 입력받은 연도(year), 월(month), 그리고 계산된 날짜(result)를 보기 좋게 조합하여 보여줍니다.
결과 설명
- 연도 2024, 월 2:
- 2024년은 year % 4 == 0 (2024 % 4 = 0)에 해당하고, year % 100 != 0 (2024 % 100 = 24)에도 해당하므로 윤년입니다. 따라서 2월은 29일까지로 계산됩니다.
- 연도 2025, 월 2:
- 2025년은 year % 4 == 0 조건에 해당하지 않으므로 윤년이 아닙니다. 따라서 2월은 28일까지로 계산됩니다.
- 연도 2025, 월 8:
- 8월은 day31 리스트 안에 있으므로 31일까지로 계산됩니다.
- 연도 2024, 월 13:
- 13은 1보다 크고 12보다 크므로 month < 1 or month > 12 조건에 해당합니다. 따라서 '존재하지 않는 월!!'이 출력되고 result가 '00'으로 설정됩니다.
- 연도 2024, 월 0:
- 0은 1보다 작으므로 month < 1 or month > 12 조건에 해당합니다. 따라서 '존재하지 않는 월!!'이 출력되고 result가 '00'으로 설정됩니다.
이 프로그램은 조건문을 효율적으로 사용하여 다양한 경우의 수를 정확하게 처리하는 좋은 예제입니다.
참고) 윤년을 정확하게 이해
질문)
A : year % 4 == 0
B : year % 100 !=0
C : year % 400 == 0
A and B or C 즉, (A and B) or C 의 결과값이 True이면 윤년인가요?
네, 맞습니다. 주어진 논리식 (A and B) or C의 결과값이 True이면 해당 연도는 윤년입니다.
이 논리식은 윤년을 판단하는 세 가지 조건을 정확하게 반영합니다.
- A: 4로 나누어 떨어지는 해
- B: 100으로 나누어 떨어지지 않는 해
- C: 400으로 나누어 떨어지는 해
논리식의 의미
논리식 (A and B) or C는 다음과 같이 해석될 수 있습니다.
- (A and B): "4로 나누어 떨어지지만, 100으로는 나누어 떨어지지 않는 해"를 의미합니다. 예를 들어, 2024년, 2028년 등이 이 조건에 해당하며, 이들은 윤년입니다.
- or C: "1번 조건에 해당하지 않더라도, 400으로 나누어 떨어지는 해"를 의미합니다. 예를 들어, 2000년은 100으로 나누어 떨어지므로 (A and B) 조건에는 부합하지 않지만, 400으로도 나누어 떨어지기 때문에 윤년이 됩니다.
따라서 (A and B) 조건이 True이거나 C 조건이 True인 경우, 전체 논리식은 True가 되어 윤년으로 판정됩니다.
정리 질문)
2000년은 100으로 나누어 나머지가 0이 아니여야 윤년인데, 나머지가 0이므로 윤년이 아니다. 하지만 400으로 나누어 떨어지므로, 2000년은 윤년이 된다.
네, 말씀하신 내용이 정확합니다. 2000년은 윤년이 맞습니다.
윤년을 판별하는 규칙을 다시 한번 정리해 드릴게요.
- 4로 나누어 떨어지는 해는 윤년입니다.
- 하지만, 100으로 나누어 떨어지는 해는 평년입니다.
- 하지만, 400으로 나누어 떨어지는 해는 다시 윤년이 됩니다.
2000년의 경우:
- 2000 % 4 == 0 이므로 첫 번째 조건에 의해 윤년이 될 가능성이 있습니다.
- 2000 % 100 == 0 이므로 두 번째 조건에 의해 평년이 될 뻔했습니다.
- 2000 % 400 == 0 이므로 세 번째 조건에 의해 다시 윤년으로 확정됩니다.
이러한 예외 규칙 때문에 1900년은 평년이었지만, 2000년은 윤년이었습니다.
참고)
A and B or C 은 (A and B) or C 와 같은 이유는 and 연산이 or 연산보다 우선순위가 높기 때문이다.
네, 맞습니다. and 연산이 or 연산보다 우선순위가 높기 때문에 A and B or C는 괄호를 사용한 (A and B) or C와 동일하게 해석됩니다.
연산자 우선순위
프로그래밍 언어에서 논리 연산자는 다음과 같은 우선순위를 가집니다.
- not
- and
- or
이 규칙에 따라, 컴퓨터는 A and B or C라는 식을 계산할 때 and 연산을 먼저 처리합니다. 따라서 (A and B)의 결과를 먼저 구하고, 그 결과와 C를 or 연산으로 연결하게 됩니다.
이것은 수학에서 곱하기(*)가 더하기(+)보다 우선순위가 높은 것과 같은 원리입니다. 예를 들어, 2 + 3 * 4는 (2 + 3) * 4가 아닌, 2 + (3 * 4)로 계산되어 결과가 14가 되는 것과 같습니다.
'파이썬(Python)' 카테고리의 다른 글
| 파이썬 실행파일 IDE Shell로 연습한 소스를 실행파일로 만드는 방법 정리(1 of 2) (1) | 2025.08.27 |
|---|---|
| 파이썬, 항공권 할인율을 조회하여 출력하는 소스 (2) | 2025.08.26 |
| 파이썬, BMI 지수 프로그램 소스 (0) | 2025.08.24 |
| 파이썬으로 소스로 프로그램을 만들어서 앱으로 올릴 수도 있나요? (0) | 2025.08.24 |
| 파이썬, 복합 비교 연산자란 무엇인지 정리 (0) | 2025.08.24 |
콘텐츠 내 자동삽입광고
