brunch

You can make anything
by writing

C.S.Lewis

by Cylogic Sep 01. 2018

만년 달력 만들기. 1 - 코딩수업#13

이번 수업에서는 서기 몇 년인지와 몇 월 인지를 입력하면 그 달의 달력을 보여주는 만년 달력을 만들어 보자.


코딩은 복잡하고 다양한 문제를 쉽게 풀어주지만, 그 풀이를 위한 기본적 논리가 없이는 코드를 만들어 나갈 수 없다. 


만년 달력의 원리


먼저 만년 달력을 만들기 위한 기본적인 원리를 알아보자.




1. 서기 1년 1월 1일은 월요일이다.


2. 1년은 365일이지만 4년마다 한 번씩 윤년이 있어서 그 해는 366일이다.


3. 100년에 한 번씩은 4년으로 나누어져도 윤년이 아니게 된다.


4. 그러나 400년에 한 번씩은 윤년이다.


5. 1년은 365일이고 7로 나누면 나머지가 1이므로 매년 윤년이 아닌 경우,

    다음 해의 오늘은 올해 요일의 다음 요일이 된다.

    즉 1년 1월 1일이 월요일이면 2년 1월 1일은 화요일이다.


6. 올해가 윤년이면 내년 1월 1일은 다음다음 요일이 된다.

   즉 4년 1월 1일이 목요일이면 5년 1월 1일은 토요일이다.




코딩에 들어가기 전에 원리를 검증해 보기로 하자.


먼저 특정한 해까지의 윤년을 계산하고 이를 기반으로 다음 해 1월 1일이 무슨 요일인지 확인하는 수식을 만들어 보자.


계산을 편하게 하기 위하여 1년부터 2000년까지의 윤년 햇수를 계산하고, 이를 기반으로 2001년 1월 1일이 어떤 요일 일지 계산해 보자.

다음 도표를 칠판에 적힌 계산이라고 생각하고 훑어보자.


위의 도표에서 계산한 것을 기반으로, 윤년이 485일 임이 분명하다면, 매년 요일 하나씩이 밀리던 기본 계산 상 2000번 요일이 밀리고 추가로 485번 요일이 밀려야 한다.

즉 2485번 요일이 뒤로 하나씩 밀리게 되는 것이다.


일주일은 7일 이므로 2485 나누기 7을 계산하면 몫은 355이고 나머지는 0가 된다. 즉 정확하게 1주일이 밀리게 되는 것이고, 1년 1월 1일이 월요일이었다면, 2001년 1월 1일 역시 월요일이 될 것이다.


만일 특정 그 나머지가 1이었다면 화요일, 2였다면 수요일... 과 같이 생각하면 된다.


가지고 계시는 휴대폰의 달력을 이용하여 2001년이 어떤 요일인지 확인해 보시라.


내 휴대폰에는 월요일로 표시된다 ^^.



대충 위의 원리를 구현할 수 있는 기본식이 완성된 것이다.

이를 바탕으로 만년 달력 코딩을 다음 수업에서 진행해 보도록 하자.


매거진의 이전글 마방진 만들기. 2 -코딩수업#12
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari