오늘은 백준 2단계 if문의 2753번 윤년과 관련된 문제를 풀이할거다.

if문과 관련된 문제는 주제 그대로 조건문을 잘 활용하면 된다. 특히 2753번의 경우, 조건이 이미 적혀있기 때문에, 크게 어려운 문제는 아니다.

제일 첫 조건에 대한 문장을 보면 다음과 같이 정리할 수 있다.

조건
(년도가 4의 배수다.) AND (100의 배수가 아니다. OR 400의 배수다.)

해당 조건만 보면 100의 배수가 아닌데 400의 배수가 어떻게 걸리는지 잘 모르겠다. (400은 100의 배수이고, 100은 또한 4의 배수이기 때문에..)

하지만 그 다음 문장을 보면 그 말을 확실하게 이해할 수 있다. "1900년은 100의 배수이지만, 400의 배수가 아니라 윤년이 아니다."

즉, 100의 배수면서 400의 배수인 연도는 윤년인 걸 알 수 있다.

또한 "2012년은 4의 배수면서 100의 배수가 아니기 때문에 윤년이다."를 보면, 100의 배수면 윤년이 아닌걸 알 수 있다.

따라서 조건은 다음과 같이 재정리 된다.

조건
1. 4의 배수고, 100의 배수가 아니면 윤년이다.
2. 4의 배수고, 100과 400의 배수면 윤년이다.

이 때, 두 조건에 공통적으로 있는 4의 배수여야 한다를 하나의 조건으로 추가할 것이고, 따라서 다음과 같이 변한다.

조건
0. 4의 배수다.
그리고
1. 100의 배수가 아니면 윤년이다.
혹은
2. 100과 400의 공약수면 윤년이다.

이 둘은 AND 연산이 아니고 OR연산인 것은 모두가 알 수 있을거라 생각한다.

1, 2번 조건 모두 나머지 연산을 통해 구할 수 있다.

1번의 경우, 연도를 (4 * 100)으로 나눴을 때 나머지가 0이어야 하고, 2번의 경우 4로 나눴을 때 나머지는 0이지만, 100으로 나눴을 때 나머지가 0이 아니면 된다.

따라서 전체 코드는 다음과 같다.

import java.util.Scanner;

public class Number2753 {
	public static void main(String args[]) {
		try(Scanner scan = new Scanner(System.in)){
			int year = scan.nextInt();

			boolean baseCondition = (year % 4 == 0);
			boolean firstCondition = (year % 100 != 0);
			boolean secondCondition = (year % 100 == 0) && (year % 400 == 0);

			if(baseCondition && (firstCondition || secondCondition)) {
				System.out.println("1");
			} else {
				System.out.println("0");
			}
		}
	}
}

이런..

아.. 왜자꾸 같은 실수를 하는지 모르겠다..

compile error는 Scanner를 import 시키지 않았고, 중간에 틀린건 내가 확인하려고 만들어노는 println문을 지우지 않아서 출력 형태가 정답과 달랐다.. ㅋㅋ..

ㅋㅋ..이런.. 해당 println문을 지우니 정답!

+ Recent posts