상세 컨텐츠

본문 제목

[Python] 윤년인지 여부 확인 파이썬 프로그램 예제

IT & Programming/파이썬 (Python) 공부

by 그림아이 2023. 4. 8. 02:00

본문

반응형

 

오늘은 입력한 연도가 윤년인지 아닌지 확인해주는 프로그램을 만들어 보겠습니다. 먼저 윤년에 대해 정확히 알고 있어야 합니다. 프로그램 언어를 공부하면서 질문을 받아 보면 많은 분들이 개념을 정확히 모르고 일단 덤비고 보다가 잘 안 되서 물어 보십니다. 윤년이 뭘까요? 단순히 4년에 한 번 2월이 29일까지 있는 해일까요? 일면 맞고, 또 일면 정확한 정의는 아닙니다.

 

윤년은 한자로는 ‘閏年’, 영어로는 ‘leap year’라고 합니다. 영어로 leap은 ‘뛰어 오르다’ 또는 ‘도약하다’라는 의미입니다. 우리는 왜 이런 개념을 만들었을까요? 그 전에 우리는 달력의 원리를 이해해야 합니다. 달력에는 율리우스력과 그레고리력이 있습니다. 태양력으로 달력을 처음 만들 때는 고대 로마에서 그 유명한 율리우스 카이사르가 채택한 달력부터 시작합니다. 당시에는 지금처럼 천문학이 발달하지 않았지만, 그렇더라도 당시 시대상을 감안하면 믿을 수 없을 정도로 정확하게 1년을 계산합니다. 지구의 공전 주기를 (물론 당시는 태양의 공전 주기라고 믿었겠지만) 365.25일로 계산했습니다. 그러니 0.25일이 4년이 되면 1일이 되니 4년마다 2월을 하루씩 늘려 보정했던 것입니다. 연도를 4로 나누어 떨어지는 해는 윤년이 됩니다. 다들 윤년을 여기까지만 알고 있는 것 같습니다.

 

하지만 1582년 교황 그레고리오 13세가 채택하여 지금까지 전 세계가 공식적으로 사용하고 있는 그레고리력에서는 계산이 보다 정밀해집니다. 시간이 지나고 보니 뭔가 잘 맞지 않았던 것입니다. 정밀하게 계산해보니 1년이 365.2422일이라는 것이 밝혀집니다. 1년을365.25일로 계산한 것보다 조금 짧아서 달력이 공전 주기보다 앞서가는 현상이 생겼던 것입니다. 그래서 여기에 규칙 하나가 추가됩니다. 400년마다 1번만 윤년을 두기로 한 것입니다. 즉, 100으로 나누어 떨어지지만 400으로 나누어 떨어지지 않는 해가 오면 윤년을 두지 않기로 한 것입니다. 어렵나요? 쉽게 말하면 서기 1700년, 1800년, 1900년은 4로 나누어지지만 윤년이 없고 1600년과 2000년은 윤년이 있습니다.

 

정리하면, 윤년이 가진 규칙은 다음과 같습니다.

1. 4로 나누어지면 윤년이다.

2. 100으로 나누어지지만 400으로 나누어지지 않으면 윤년이 아니다.

 

반드시 두가지 규칙을 모두 만족시켜야 하는 알고리즘을 만들면 됩니다. 제가 생각한 알고리즘은 먼저 사용자가 숫자만 입력하도록 유도하고, 입력한 숫자가 4로 나눠지는지 확인부터 합니다. 그리고 4로 나눠 나머지가 없는 숫자가 100과 400 모두 나눠지면 윤년으로 판단합니다. 하지만 4로 나눠 나머지가 없는 숫자가100으로는 나눠지는데 400으로는 나눠지지 않으면 윤년이 아닌 것으로 판단합니다. 이 두가지 경우가 아니고 단순히 4로 나눠지면 윤년으로 판단합니다. 그리고 마지막으로 처음부터 4로 나눠지지도 않으면 윤년이 아닌 것으로 판단합니다.

 

그리고 이번에는 연도만 입력을 받아야 하므로 int 함수를 사용했고 try, except 구문을 사용했습니다. If 구문과 유사한데, 에러 처리에 특화된 구문입니다. try에서 먼저 시도해보고, 에러가 날 경우 except에서 어떻게 처리할지 정의하는 방법입니다. 알아두시면 좋습니다.

 

반응형

 

완성된 코딩 구문은 다음과 같습니다.

 

#사용자가 정수만 입력하도록 무한반복 구문 사용
while True:
    try:
        input_year = int(input("\n윤년인지 확인하고 싶으신연도를 숫자로 입력하세요 : "))
        break
    except:
        print("\n")
        print("잘 좀 입력해주시죠. :(")
        continue

#입력한 연도가 4로 나눠지는지 확인
if input_year % 4 == 0:
    #4로 나눠진 숫자가 100과 400 모두로 나눠지면 윤년
    if input_year % 100 == 0 and input_year % 400 == 0:
        print("윤년입니다!")
    #4로 나눠진 숫자가 100으로는 나눠지지만 400으로나눠지지 않으면 윤년이 아님
    elif input_year % 100 == 0 and input_year % 400 != 0:
        print("윤년이 아닙니다!")
    #위 두가지 경우가 아니고 단순히 4로만 나눠지면 윤년
    else:
        print("윤년입니다!")
        
#입력한 연도가 4로 나눠지지 않으면 윤년이 아님
else:
    print("윤년이 아닙니다!")

 

윤년인지 확인하고 싶으신 연도를 숫자로 입력하세요 : 3456

윤년입니다!

 

윤년인지 확인하고 싶으신 연도를 숫자로 입력하세요 : 2700

윤년이 아닙니다!

 

윤년인지 확인하고 싶으신 연도를 숫자로 입력하세요 : 2024

윤년입니다!

 

 

아무 숫자나 넣어봤더니 작동이 잘 되는 것을 확인할 수 있습니다. 2024년은 2월이 29일까지 있는 윤년입니다. 4년마다 생일이 돌아오는 분들은 4년치 생일잔치 잘 하시고 선물 4년치 받으시길 바랍니다.

 

제가 만든 것이 정답은 아닙니다. 저는 정답이라고 글을 쓰거나 자랑하려고 올리는 것이 아닙니다. 저는 부족한 것 투성이임을 누구보다 잘 알고 있습니다. 그래서 공부를 놓지 못하고 계속하는 것입니다. 반복해서 말씀 드리지만, 저도 처음 공부 시작할 때 누군가에게 도움을 받았으니, 저도 누군가에게 도움을 드리고자 할 뿐입니다. 시작할 때의 그 막막함과 답답함을 저는 너무 잘 알고 있으니까요.

 

끝으로…

 

프로그램 언어 공부는 이렇게 갑자기 만들고 싶은 것이 있어야 실력이 향상됩니다. 함수를 잔뜩 외운다고 늘지 않습니다. 직접 프로그램을 만들어 보고, 책이나 인터넷에서 남이 만든 코딩을 영어 해석하듯이 해석해보고, 때론 응용도 하면서 씹고, 뜯고, 맛보고, 즐기고 해야 합니다. 저도 그랬습니다. 

 

세상 모든 것이 그러하듯이, 코딩도 꾸준히 하다 보면 실력이 늡니다.

 

 

728x90
반응형

관련글 더보기

댓글 영역