IT/BaekJoon

[백준/JAVA] 2753 - 윤년 : 그래서 윤년이 뭘까?

Buang 2023. 1. 15. 21:56
반응형

1. 문제

 

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.

윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.

 

즉 400의 배수면 윤년에 해당한다.

4의 배수이면서 100의 배수가 아닐 때도 윤년에 해당한다.

그 외에는 윤년이 아니다.

 

예를 들어, 2012년은 4의 배수지만 100의 배수가 아니라서 윤년이다.

1900년은 100의 배수이고, 400의 배수가 아니라 윤년이 아니다. 

2000년은 400의 배수라 윤년이다.

 

 

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

 

2753번: 윤년

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

www.acmicpc.net

 


2. 코드

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in); 
		int year = scan.nextInt();
		scan.close();
				
		if ((year % 4 == 0) && ((year % 100) != 0)  || ((year % 400) == 0))  
			System.out.println("1");
		else
			System.out.println("0");
			
	}
}

 

 


3. 풀이

 

윤년이 되는 조건을 잘 확인하면 되는 문제다.

윤년인지 아닌지 확인하는 방법에 대한 풀이는

'3-3. 윤년 판별 방법'에 상세히 작성했다.


3-1. 변수 선언

int year = scan.nextInt();

 

일단 사용자가 입력한

연도를 토대로 윤년을 판별하기 때문에

사용자가 입력한 연도를 저장하는 변수인 year을 선언했다.

 


3-2. 배수 판별 방법

 

윤년은 연도가 4의 배수이면서 100의 배수가 아니면 윤년이다.

 

일단 입력된 연도가 4의 배수인지 

판별하는 방법은 어떤 숫자를 4로 나눴을 때

나머지가 0인지 확인하면 된다.

 

예를 들어서 28은 4의 배수다.

28을 4로 나누면 나머지는 0이다.

4, 8, 12, 16과 같은 4의 배수들은

모두 4로 나눴을 때 나머지가 0이 된다.

 

그렇기에 4의 배수인지 판별하기 위해서 

어떤 수를 4로 나눴을 때 나머지가 0이면 4의 배수임이 확인 가능하다.

 

year % 4 == 0

 

그래서 위와 같이 4의 배수인지 확인하는 걸 작성해 줬다.

%는 나머지 연산자로

숫자 % 4 를 작성하면 4로 숫자를 나눴을 때의 나머지가 나온다.

8 % 4 를 입력하면, 8을 4로 나누기 때문에 나머지는 0이다.

그래서 0을 반환한다.

 

 


 

3-3. 윤년판별방법

 

"윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다."

 

라고 문제에 나와있었다. 

 

'이면서'는 두 가지 조건을 동시에 충족하는 것을 의미하기에 AND 연산자로 표현하고,

'또는'은 두 가지 중 한 가지 조건만 충족해도 true을 반환하는 OR 연산자로 쓰면 된다.

 

 

"윤년은 연도가 4의 배수 && 100의 배수가 아닐 때 || 400의 배수일 때이다."

 

문제를 연산자 기호로 표기하면 위와같이 표기가 가능할 것이다.

 

이제 연도가 4의 배수일 때 100의 배수가 아닐 때

400의 배수일 때를 코드로 표현하면 된다.

 

연도가 4의 배수라는 것은

year % 4 == 0 으로 나타낼 수 있다.

 

연도가 100의 배수가 아니라는 것은

year % 100 != 0 으로 나타낼 수 있다.

 

연도가 400의 배수라는 건

year % 400 == 0 으로 나타낼 수 있다.

 

 

위의 3개 식을 AND 연산자인 &&과

OR 연산자인 || 으로 이어주면 된다.

 

if ((year % 4 == 0) && ((year % 100) != 0))

 

연도가 4의 배수이면서 100의 배수가 아닐 때

즉 2가지 조건이 동시에 충족됐을 때 윤년의 조건에 맞기 때문에

2가지 조건, 혹은 두 식이 참일 경우 참을 반환하는 AND 연산자인 &&을 사용한다.

 

위와 같이 작성해 놓으면

입력한 연도가 4의 배수가 아니거나

100의 배수이면 바로 false가 반환될 것이다.

 

if ((year % 4 == 0) && ((year % 100) != 0)  || ((year % 400) == 0))

 

 400의 배수일 때 윤년이라고 했음으로

뒤에 부분을 마저 작성해 준다.

 

왜 year % 400 == 0 앞에 OR 연산자인 || 이

붙었는지 궁금하다면 아래 문제를 다시 한번 읽어보자.

 

 

"윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다."

 

"윤년은 연도가 4의 배수    &&    100의 배수가 아닐 때    ||   400의 배수일 때이다."

 

 

if ((year % 4 == 0) && ((year % 100) != 0)  || ((year % 400) == 0))  
    System.out.println("1");
else
    System.out.println("0");

 

윤년일 땐 1을 윤년이 아닐 때는 0을 출력하기 때문에

최종적으로 if문은 위와 같이 완성된다.

반응형