Algorithms
[알고리즘] 윤년 계산하기
bunny_coder
2023. 7. 9. 22:09
윤년을 계산하는 알고리즘은 프로그래밍 언어를 처음 배울 때마다 항상 활용되는데 자주 까먹어서 간단하게나마 정리해보려 한다. 다음에 윤년과 관련한 걸 하게 되면 이 포스팅을 다시 참고해야지(새로운 언어를 배울 일 자체가 더 있긴 한가?)
윤년이란?
윤년은 역법을 실제 태양년에 맞추기 위해 여분의 하루 또는 월을 끼우는 해를 말한다. 1년은 365일이지만 실제 지구가 태양을 한 바퀴 도는 데 365일 하고도 5시간 48분 46초가 걸리기 때문에 이 남은 시간을 모아 4년마다 한 번 2월을 28일에서 29일까지 두는 것이다.
윤년 계산 알고리즘
1. 4로 나누어 떨어지는 해는 윤년으로 한다.
2. 1번의 해 중에서 100으로 나누어 떨어지는 해는 평년으로 한다.
3. 그러나 2번의 해 중에서 다시 400으로 나누어 떨어지는 해는 윤년으로 한다.
코드
Java
# 1. 설명한 알고리즘 그대로 구현하기
public class Date {
private int year;
private int month;
private int day;
private int[] lastDayOfMonth = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 생성자 및 Getter, Setter 생략
private void setLunarYear() {
last = 28;
if(this.year % 4 == 0) {
last = 29;
if(this.year % 100 == 0){
last = 28;
if(this.year % 400 == 0) {
last = 29;
}
}
}
lastDayOfMonth[1] = last;
}
}
# 2. AND와 OR을 활용하기
year % 4 == 0 | year % 100 == 0 | year % 400 == 0 | Year는 |
T | T | T | 평년(28days) |
T | F | T | 윤년(29days) |
F | T | T | 평년(28days) |
F | F | T | - |
T | T | F | 평년(28days) |
T | F | F | 윤년(29days) |
F | T | F | 평년(28days) |
F | F | F | 평년(28days) |
4와 100으로 안 나눠지는데 400으로 나누어지는 경우는? 없다.
위 진리표에서 윤년인 경우를 가져와서 적용해보자!
public class Date {
private int year;
private int month;
private int day;
private int[] lastDayOfMonth = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 생성자 및 Getter, Setter 생략
private void setLunarYear() {
lastDay = 28;
if((this.year % 4 == 0 && this.year% 100 != 0) ||
(this.year % 4 == 0 && this.year % 100 == 0 && this.year % 400 == 0)) {
lastDay = 29;
}
lastDayOfMonth[1] = lastDay;
}
}
출처:
https://ko.wikipedia.org/wiki/%EC%9C%A4%EB%85%84
윤년 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 윤년(閏年)은 역법을 실제 태양년에 맞추기 위해 여분의 하루 또는 월(月)을 끼우는 해이다. 태양년은 정수의 하루로 나누어떨어지지 않고, 달의 공전주기와 지
ko.wikipedia.org