오늘은 백준 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문을 지우니 정답!
'공부 > 알고리즘' 카테고리의 다른 글
[Java 코딩테스트] 백준 1110 문제풀이 / 더하기 사이클 (0) | 2021.07.22 |
---|---|
[Java 코딩테스트] 백준 2438 문제풀이 Dynamic Programming (0) | 2021.07.19 |
[Java 코딩테스트] 백준 15552번 문제 풀이 (0) | 2021.07.18 |
[Java 코딩테스트] 백준 2884번 문제풀이 (0) | 2021.07.18 |
[Java 코딩테스트] 백준 2588번 문제풀이 (0) | 2021.07.12 |