1. 문제
연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.
윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.
즉 400의 배수면 윤년에 해당한다.
4의 배수이면서 100의 배수가 아닐 때도 윤년에 해당한다.
그 외에는 윤년이 아니다.
예를 들어, 2012년은 4의 배수지만 100의 배수가 아니라서 윤년이다.
1900년은 100의 배수이고, 400의 배수가 아니라 윤년이 아니다.
2000년은 400의 배수라 윤년이다.
https://www.acmicpc.net/problem/2753
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문은 위와 같이 완성된다.
'IT > BaekJoon' 카테고리의 다른 글
[백준/JAVA] 2525 오븐 시계 (0) | 2023.02.26 |
---|---|
[백준/JAVA] 14681 사분면 고르기 (0) | 2023.02.12 |
[백준/JAVA] 9498 - 시험성적 (0) | 2023.01.14 |
[백준/JAVA] 1330번 - 두 수 비교하기 (0) | 2023.01.08 |
[백준/JAVA] 2588번. 곱셈 문제 - charAt는 뭐고 왜 쓰는 걸까? (0) | 2023.01.01 |