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