Leap year
윤년(閏年)은 역법을 실제 태양년에 맞추기 위해 여분의 하루 또는 월(月)을 끼우는 해이다. 태양년은 정수의 하루로 나누어떨어지지 않고, 달의 공전주기와 지구의 공전주기는 다르기 때문에 태양력에서는 하루(윤일), 태음태양력에서는 한 달(윤달)을 적절한 시기에 끼워서 이를 보정한다.
태양력에서는 보통 윤일이 들어 있는 해를 말하는데, 이 경우 01년은 366일이 되며 이것이 바로 윤년이다. 지구가 태양을 한 바퀴 도는 데에는 365일 5시간 48분 46초가 걸리므로 365일을 제외한 시간들을 모아 태양력에서는 04년마다 한 번 2월 29일을 두어 하루를 늘리고, 태음력에서는 평년이 354일이므로 계절과 역월(曆月)을 조절하기 위하여 19년에 7번의 비율로 윤달을 끼워 1년을 12개월로 한다. 윤년이 아닌 해는 평년이라고 한다.
태양력의 윤년은 12지에서 토끼띠, 양띠, 돼지띠에 해당하며, 육십간지 중 경자, 경진, 경신년의 경우 윤년이 아닌 경우도 있고 임자, 갑자, 병자, 무자, 임진, 갑진, 병진, 무진, 임신, 갑신, 병신, 무신년은 무조건 윤년이다. 또한 2월 29일이 낀 경우에는 윤년인 해의 1월 1일부터 그 다음 해 평년인 12월 31일까지 전년과 2요일 차이가 난다. 예를 들어 2024년 1월 1일이 월요일이면 2월 29일로 인해 두 요일이 밀려 화요일은 건너뛰고 2025년 3월 1일과 2026년 2월 28일은 토요일이 된다. 1월은 2월 29일에 의해 4월, 7월과 요일이 동일하거나 비슷한 현상이 나타나고 3월도 마찬가지로 전년 9월과 전년 12월에 동일하거나 비슷한 현상이 나타난다.
3개의 명령어로 윤년 여부를 확인하기
개요 및 문제 제시
- 0에서 102499년 사이의 년도에 대해, 단 3개의 CPU 명령어만 사용하여 윤년을 판별하는 함수
- 사용되는 실제 함수는 ((y * 1073750999) & 3221352463) <= 126976 구조임
전통적인 윤년 판별 방법
- 보통 윤년 판별은 나눗셈(modulo)와 조건분기로 구현함
- 4로 나누어 떨어지는지, 100으로 안 나누어지는지, 400으로 나누어 떨어지는지 검사함
예시 코드:
if ((y % 4) != 0) return false
if ((y % 100) != 0) return true
if ((y % 400) == 0) return true
return false
표준 접근 방식의 최적화
- (y % 100) 검사를 (y % 25)로, (y % 400) 검사를 (y % 16)으로 대체 가능함
- 그 이유는 앞서 4로 이미 나누었으므로, 25 및 16 곱셈 관계로 변경 가능
- 예: x * 3264175145 > 171798691로 변환 가능
분기 없는(branchless) 구현법
분기가 없는 형태로도 변환 가능함:
이러한 방식은 코드 골프(coding golf)와 같이 코드 길이 줄이기에 적합
See also
- year