상냥한 세상 :: [백준]2753번: 윤년계산

본문으로 바로가기

[백준]2753번: 윤년계산

category Computer Science/BAEKJOON JAVA Practice 2021. 12. 26. 11:20
  • 문제

https://www.acmicpc.net/problem/2753

 

2753번: 윤년

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 2012년은 4의 배수이면서

www.acmicpc.net


태양년은 정수의 하루로 나누어 떨어지지 않고 달의 공전주기와 지구의 공전주기는 다르기에 태양력에선 하루(윤일), 태음태양력에서는 한달(윤달)을 적절한 시기에 끼워서 이를 보정
윤년: 양력에서는 4년마다 한번씩 2월을 29일로 하고, 음력에선 5년에 두번의 비율로 13개월로 함(과년). 태양년에 맞추기 위해 여분의 하루 또는 월을 끼우는 해. 즉 태양력에서 윤일이 들어 있는해. 1년이 366일이 됨.

윤년은 4의배수임과 동시에 100의 배수가 아닌 혹은 400의 배수일때 성립

ex)2016년은 4x504가 성립하는 4의 배수이면서, 100x20+16 즉 100의 배수가 아니라서 윤년이다.

ex)2000년은 400의 배수라서 윤년이다

ex)1900년은 100의 배수이고 400의 배수는 아니기에 윤년이 아니다. 

정리하면, 

연수가 4로 나누어 떨어지는 해는 윤년 
ex)1998년, 1992년, 1996년, 2004년, 2024년,2032년...
연수가 4,100으로 나누어 떨어지는 해는 평년(윤년이 아닌해)
ex)1700년, 1800년, 1900년, 2100년, 2200년,2300년
연수가 4,100,400으로 나누어 떨어지는 해는 윤년
ex)1600년, 2000년, 2400년

400년에 윤년은 97년이나 비중을 차지하며, 1년 평균 356.2425일이 된다. 약 3300년마다 1일의 편차가 일어난다.

이역시 조건을 따지기 때문에 삼항연산자 또는 if조건문으로 문제를 접근해야 한다. 주의할 점은 연도수가 0 또는 음수가 될 수 없으므로, 연도 X는 무조건 0 <X이여야 하고, 문제에선 4000 이하의 연도수를 요구하므로 정리하면0 <X≤4000 범위 내에서 윤년을 찾아내야 한다.


  • 코드 1
import java.io.Scanner;

public class Main{
	public static void main(String[] args){
    	Scanner in=new Scanner(System.in);
        
        int X=in.nextInt();
        in.close();
        
        System.out.print(X%4==0)?((X%400==0)?"1":(X%100==0)?"0":"1"):"0");
    }
}

1-1 단계 : 4의 배수일 경우 - if ( year%4==0 )
    2-1 단계 : 4의 배수이면서 400의 배수일 경우 - if ( year%400 == 0 )->1
    2-2 단계 : 4의 배수이면서 100의 배수일 경우 - else if ( year%100 == 0 )->0
    2-3 단계 : 2단계 조건식 나머지 - else->1
1-2 단계 : 1 단계 조건식 나머지 - else->0

이런 구조로 생각하면 편하다.


  • 결과


  • 코드 2
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.IOException;

public class Main{
	public static void main(String[] args)throws IOException{
    	BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        
        int X=Integer.parseInt(br.readLine());
        System.out.print((X%4==0)?((X%400==0)?"1":(X%100==0)?"0":"1"):"0");
    }
}

  • 결과


  • 코드 1,2 속도 비교

Scanner 사용
BufferedReader 사용