study/c언어 알고리즘

[c언어] 윤년 구하기

Having 2022. 4. 6.

0. 윤년이란?

윤년(閏年)은 역법을 실제 태양년에 맞추기 위해 여분의 하루 또는 월(月)을 끼우는 해이다. 태양년은 정수의 하루로 나누어떨어지지 않고,  공전주기 지구의 공전주기는 다르기 때문에 태양력에서는 하루(윤일), 태음태양력에서는 한 달(윤달)을 적절한 시기에 끼워서 이를 보정한다. (위키백과)

 

1. 윤년을 구하는 방법

지구가 태양 둘레를 한 바퀴 도는 시간이 딱 365일이 아니기 때문에 이를 보정한다. 보정하기 위해 4로 나누어떨어지는해를 윤년으로 하는데, 그러나 이것 또한 부족하여 100으로 나누어떨어지지 않고 400의 배수인 날 또한 윤년으로 한다. 

 

2. 구현하기

년, 월, 일을 입력해 첫해부터 모든 일을 더하여 보여주는 프로그램을 구현해 보자. 

#include <stdio.h>

int mdays[][12] = {
	{31,28,31,30,31,30,31,31,30,31,30,31},
	{31,29,31,30,31,30,31,31,30,31,30,31}
};
int isleap(int year){
	return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}

int dayofyear(int y, int m, int d){
	int days = d;
	int i;
	for(i=1;i<m;i++){
		days += mdays[isleap(y)][i-1];
	}
	return days;
}

int main(void){
	int year, month, day;
	int retry;
	do{
		printf("년을 입력해 주세요 : "); 
		scanf("%d", &year);
		printf("월을 입력해 주세요 : "); 
		scanf("%d", &month);
		printf("일을 입력해 주세요 : "); 
		scanf("%d", &day);
		printf("총 일 : %d", dayofyear(year, month, day)); 
		printf("다시 하시겠습니까? 1 or 0 : ");
		scanf("%d", &retry);
	}while(retry == 1);
	return 0;
}

평년과 윤년의 최대 일을 mdays 2차원 배열에 초기화를 했다. 

 

year % 4 == 0 && year % 100 != 0 || year % 400 == 0;

만약 윤년을 확인하는 수식 둘 중 1개라도 참이라면 1을 return하게 된다. 

 

mdays[isleap(y)][i-1]

1이 반환되면 두번째 행에 저장된 윤년의 일을 가리키게 된다. 

 

책 자료구조와 함께 배우는 알고리즘 입문을 참고

'study > c언어 알고리즘' 카테고리의 다른 글

[c언어] 소수 구하기 알고리즘 최적화  (0) 2022.04.05

댓글