회고록 블로그

[백준 코테 풀기] 2753번. 윤년 본문

4. 기타 공부/코테 준비

[백준 코테 풀기] 2753번. 윤년

김간장 2021. 11. 29. 20:34

[문제]

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

 

2753번: 윤년

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

www.acmicpc.net

 

[풀이]

윤년의 기준을 정확하게 정리할 필요가 있다.

도와줘요 구글!

 

<윤년 기준>

  • 해당 연도가 4의 배수이면 윤년이다.
  • 해당 연도가 4의 배수이면서, 100의 배수가 아니면 윤년이다. (4의 배수이면서 100의 배수라면 윤년이 아닐 가능성이 크다)
  • 해당 연도가 400의 배수이면 윤년이다. (100의 배수이면서 400의 배수가 아니라면 윤년이 아니다)

출처 : https://ko.wikihow.com/%EC%9C%A4%EB%85%84%EC%9D%84-%EA%B3%84%EC%82%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

 

즉, 위의 내용을 정리하자면 이런 상황으로 구해지는 듯 하다.

 

이때, "위의 상황을 보면 4의 배수는 무조건 모두 '윤년'으로 저장되어 있고 400(=4*100)은 4의 배수이니까

굳이 한번 더 400의 배수인지 체크할 필요가 없지 않나"라고 생각할 수 있는데 아니다.

 

2400년 같은 경우 4의 배수이자 100의 배수이기 때문에 "평년"으로 출력되어버린다.

때문에 "400의 배수인지 확인하는 과정"이 반드시 필요하고,

"100의 배수인지 확인하는 과정"보다 에 있어야 한다.

 

"400의 배수인지 체크하는 if문"을 "4의 배수인지 체크하는 if문" 안에 넣지 않고, 따로 빼서 뒤에 두어도 된다.

 

아니면 "100의 배수가 아닌지 확인하는 과정"과 "400의 배수인지 확인하는 과정"을 or로 연결하거나.

어쨌든 중요한 점은 400이 4의 배수라고 해서 "400의 배수인지 확인하는 과정"을 생략하면 안된다는 점이다.

 

 

[결과]

설계는 위와 같이 했는데

코드로 구현할 땐 길게 쓰기 귀찮아서 if문의 조건을 한줄로 정리했다.

import java.util.Scanner;

class LeapYearCal {
	private int year;
	private int result; // 윤년여부 결과 (1이면 윤년, 0이면 평년)
	
	LeapYearCal(int year) {
		if(year >= 1 && year <= 4000) {
			this.year = year;
		}
	}
	int printWhetherLeapYear() {
		if(((year % 4) == 0) && (((year % 100) != 0) || ((year % 400) == 0))) {
        // 4의 배수이고, (100의 배수가 아니거나 400의 배수가 맞으면) => "윤년"
			result = 1; 
		}
		else
			result = 0;
		return result;
	}
}

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		LeapYearCal year = new LeapYearCal(sc.nextInt());
		System.out.println(year.printWhetherLeapYear());
	}
}

 

 

Comments