본문 바로가기

JAVA

자바 윤년 계산 알고리즘 (백준 2753번 윤년 코드)

* 윤년이란?

지구가 태양을 한 번 공전하는 데 걸리는 시간을 일 년으로 두었는데, 사실은 그 시간이 365일이 아닌 365일 5시간 49분 가량이다. 일 년에 5시간 49분씩 4 년이 지나면 약 하루가 되는데, 이를 맞추기 위해 4 년마다 한 번씩 2월을 하루 늘리고 이를 윤년이라 한다. 

단, 이렇게 계산하게 되면 매년 11분 가량이 초과되어 계산된다. 이는 131년이 지나면 하루(대략 400년에 3일)가 되기 때문에 대부분의 국가에서 반영하는 그레고리력에서는 400년에 3일을 제외시키기 위해 100년마다 한 번 윤년을 없애고 400년 마다 다시 하루를 추가해 윤년을 둔다. 정리하면 다음과 같은 방법으로 윤년을 계산할 수 있다.

☞ 연도가 4로 나누어 떨어지면 윤년이다. ex) 2020년, 2024년, 2028년, ...

☞ 연도가 100으로 나누어 떨어지면 윤년이 아니다. ex) 2100년, 2200년, 2300년, ...

☞ 연도가 400으로 나누어 떨어지면 윤년이다. ex) 2000년, 2400년, 2800년, ...

예를 들면 2000년은 100의 배수이지만 400으로 나누어 떨어지기 때문에 윤년이다. 이를 알면 조건문을 활용하여 코드화하는 것은 쉽다. 두 가지 알고리즘을 생각해보았다.



알고리즘 1) 4로 나누어 떨어지면 우선 윤년으로 판단하고, 그 중 400이 아닌 100으로만 나누어 떨어지는 경우를 평년으로 판단한다.

알고리즘 2) 주어진 연도가 400으로 나누어 떨어지면 윤년으로 판단하고 종료한다. 아닐 경우 100으로 나누어 떨어지면 평년으로 판단하고 종료한다. 그것도 아닐 경우 4로 나누어 떨어지면 윤년으로 판단하고 종료한다. 이 외의 모든 케이스는 평년이다. 

 

아래는 알고리즘 1의 방법으로 구현한 윤년/평년 구분 프로그램의 코드이다.

import java.util.*;

class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        
        if(a%4 == 0){
            if(a%400 != 0 && a%100 == 0)
                System.out.println("0");
            else
                System.out.println("1");
        }
        else{
            System.out.println("0");
        }
        
    }
}

 

아래는 알고리즘 2의 방법으로 구현한 윤년/평년 구분 프로그램의 코드이다.

import java.util.*;

class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        
        if(a%400 == 0)
            System.out.println("1");
        else if(a%100 == 0)
            System.out.println("0");
        else if(a%4 == 0)
            System.out.println("1");
        else
            System.out.println("0");      
    }
}

 

개인적으로는 알고리즘 1이 윤년 계산법이 만들어진 원리를 더 잘 담고 있어 알고리즘 1의 방식으로 코딩하는 것을 더 선호하는 편이다.