[ 문제 ]

#include <iostream>
using namespace std;
 
//윤년 판별 규칙
//  400으로 나누어 떨어지면 윤년
//  100으로 나누어 떨어지면 평년
//  4로 나누어 떨어지면 윤년
//  그 외는 평년
//함수는 윤년이면 true, 아니면 false를 반환한다.
 
 
bool is_leap(int y) {
    //여기에 작성하세요.
}
 
int main() {
    cout << boolalpha << is_leap(2000) << " " << is_leap(1900) << " " << is_leap(2024) << "\n"; // true false true
}

[ 개념 ]

  1. 나머지 연산자 %
y % 4 == 0
  1. bool 자료형
bool result = true;
  1. 조건문(if-else) : 조건을 순서대로 검사
if (조건1)  
{  
}  
else if (조건2)  
{  
}  
else  
{  
}
  1. 윤년 판별 규칙
//400의 배수 → 윤년  
//100의 배수 → 평년  
//4의 배수 → 윤년  
//나머지 → 평년

[ 풀이 ]

#include <iostream>
using namespace std;
 
//윤년 판별 규칙
//400의 배수 → 윤년  
//100의 배수 → 평년  
//4의 배수 → 윤년  
//나머지 → 평년
//함수는 윤년이면 true, 아니면 false를 반환한다.
 
 
bool is_leap(int y) {
    if (y % 400 == 0)
	{  
		return true;  
	}
	else if (y % 100 == 0)  
	{  
		return false;  
	}
	else if (y % 4 == 0)  
	{  
		return true;  
	}
	else  
	{  
		return false;  
	}
}
int main() {
    cout << boolalpha << is_leap(2000) << " " << is_leap(1900) << " " << is_leap(2024) << "\n"; // true false true
}
 
#include <iostream>
using namespace std;
 
//윤년 판별 규칙
//400의 배수 → 윤년  
//100의 배수 → 평년  
//4의 배수 → 윤년  
//나머지 → 평년
//함수는 윤년이면 true, 아니면 false를 반환한다.
 
 
bool is_leap(int y) 
{ 
	return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); 
}
int main() {
    cout << boolalpha << is_leap(2000) << " " << is_leap(1900) << " " << is_leap(2024) << "\n"; // true false true
}

[ 해설 ]

#include <iostream>
 
using namespace std;
 
// ==========================================
// 윤년 판별 규칙 (우선순위 순서대로 검사)
// 1. 400의 배수이다 -> 무조건 윤년 (최고 우선순위 예외)
// 2. 100의 배수이다 -> 평년 (4의 배수이지만 윤년이 아님)
// 3. 4의 배수이다   -> 윤년 (기본 규칙)
// 4. 나머지 모든 수 -> 평년
// ==========================================
bool is_leap(int y) {
 
    // [Step 1] 가장 큰 예외인 400의 배수를 먼저 걸러냅니다.
    // 만약 2000년이라면, 아래 100의 배수 조건에도 걸리기 때문에 
    // 가장 강력한 조건인 400의 배수를 맨 위에 배치해야 합니다.
    if (y % 400 == 0)
    {
        // 400으로 나누어 떨어지면 무조건 윤년이므로 true 반환 후 함수 종료
        return true;
    }
    // [Step 2] 앞선 400의 배수가 아니면서, 100의 배수인 경우를 찾습니다.
    // 예: 1900년 (4의 배수이자 100의 배수이지만, 400의 배수는 아님)
    else if (y % 100 == 0)
    {
        // 100의 배수인 해는 평년으로 처리하므로 false 반환 후 함수 종료
        return false;
    }
    // [Step 3] 앞의 조건(400, 100의 배수)을 모두 피해간 수 중 4의 배수를 찾습니다.
    // 예: 2024년 (4의 배수이면서 100의 배수는 아님)
    else if (y % 4 == 0)
    {
        // 4의 배수이므로 윤년 처리, true 반환 후 함수 종료
        // (이미 위에서 100의 배수들이 걸러졌기 때문에 순수한 4의 배수만 남습니다)
        return true;
    }
    // [Step 4] 위의 세 가지 조건에 모두 해당하지 않는 평범한 해입니다.
    // 예: 2023년 (4로 나누어 떨어지지 않음)
    else
    {
        // 4의 배수조차 아니므로 평년 처리, false 반환
        return false;
    }
}
 
int main() {
    // boolalpha: 조작자(Manipulator)로, 1과 0 대신 true/false 텍스트로 출력하게 만듭니다.
    // is_leap(2000) -> 400의 배수이므로 [Step 1]에서 true 반환
    // is_leap(1900) -> [Step 1] 패스, 100의 배수이므로 [Step 2]에서 false 반환
    // is_leap(2024) -> [Step 1, 2] 패스, 4의 배수이므로 [Step 3]에서 true 반환
    cout << boolalpha << is_leap(2000) << " " << is_leap(1900) << " " << is_leap(2024) << "\n"; 
    
    return 0; // 프로그램이 성공적으로 종료되었음을 의미 (생략 가능)
}