[ 문제 ]
#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
}
[ 개념 ]
- 나머지 연산자
%
y % 4 == 0
- bool 자료형
bool result = true;
- 조건문(if-else) : 조건을 순서대로 검사
if (조건1)
{
}
else if (조건2)
{
}
else
{
}
- 윤년 판별 규칙
//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; // 프로그램이 성공적으로 종료되었음을 의미 (생략 가능)
}