양의 정수 n이 주어졌을 때, 1년부터 n년까지의 총 일수를 7(한 주의 일수)로 나눈 나머지, 즉 홀수 일(odd days)의 개수를 구하는 것이 이번 글의 목표입니다. 홀수 일은 달력 계산에서 특정 날짜의 요일을 빠르게 구할 때 활용되는 개념입니다.
예시
입력: days = 500 출력: 홀수 일의 개수: 5 입력: days = 400 출력: 홀수 일의 개수: 0
홀수 일 계산 원리
홀수 일을 계산하려면 무엇보다 먼저 해당 기간에 포함된 연도가 윤년인지 평년인지 판별해야 합니다. 윤년 여부에 따라 한 해의 일수와 홀수 일 개수가 달라지기 때문입니다.
윤년 판별 규칙은 다음과 같습니다.
- 4로 나누어 떨어지는 해는 윤년이다.
- 단, 100으로 나누어 떨어지는 해는 평년이다.
- 400으로 나누어 떨어지는 해는 다시 윤년이다.
전체 일수를 7로 나눈 나머지(modulus)를 구하면 그 값이 곧 홀수 일의 개수가 됩니다. 평년은 365일이므로 홀수 일이 1개(365 % 7 = 1)이고, 윤년은 366일이므로 홀수 일이 2개(366 % 7 = 2)입니다.
프로그램의 접근 방식
- 연도 수(days)를 입력값으로 받습니다.
- 기간 내에 포함된 윤년과 평년의 개수를 각각 계산합니다.
- 전체 일수에 모듈로(%) 연산을 적용하여 홀수 일을 구합니다.
- 1부터 n년까지 누적된 최종 홀수 일 개수를 화면에 출력합니다.
알고리즘
시작
Step 1 -> 주어진 연도의 홀수 일 개수를 계산하는 함수 선언
int cal_odd(int days)
int cal_1 = days / 100 // 100으로 나누어 떨어지는 해의 개수
int cal_2 = days / 400 // 400으로 나누어 떨어지는 해의 개수
int check_leap = days >> 2 // 4로 나누어 떨어지는(윤년 후보) 해의 개수
int temp = days - check_leap // 평년의 개수
IF (cal_1)
temp += cal_1
check_leap -= cal_1
End
IF (cal_2)
temp -= cal_2
check_leap += cal_2
End
int final_days = temp + check_leap * 2 // 평년은 1, 윤년은 2씩 더함
int odd = final_days % 7
return odd
Step 2 -> main() 함수 안에서
int days = 500
cal_odd(days) 호출
종료
C++ 예제 코드
#include <iostream>
using namespace std;
// 주어진 연도의 홀수 일 개수를 계산하는 함수
int cal_odd(int days) {
int cal_1 = days / 100;
int cal_2 = days / 400;
int check_leap = days >> 2;
int temp = days - check_leap;
if (cal_1) {
temp += cal_1;
check_leap -= cal_1;
}
if (cal_2) {
temp -= cal_2;
check_leap += cal_2;
}
int final_days = temp + check_leap * 2;
int odd = final_days % 7;
return odd;
}
int main() {
int days = 500;
cout<<"number of odd days are : "<<cal_odd(days);
return 0;
}
출력 결과
number of odd days are : 5
결과 해석: 400년은 정확히 146,097일로 7로 나누어 떨어지므로 홀수 일이 0개입니다. 따라서 500년은 400년(홀수 일 0개)과 100년(평년 76년 × 1 + 윤년 24년 × 2 = 124 → 124 % 7 = 5)으로 나누어 생각할 수 있으며, 최종적으로 홀수 일 5개가 됩니다.