본문 바로가기
Do it 알고리즘 입문[C]

다차원 배열_한 해의 지난 날 수 계산하기

by 횰임 2022. 1. 20.

✅point

ex) 12월 20일일 때

한 해의 지난 날수 계산 : 20일 + 1~11월까지 각 달의 날 수

🔺이때 평년은 2월이 28일, 윤년은 29일이다. 

(*윤년: 4의 배수 가운데 100의 배수 제외하고, 다시 400의 배수 포함시킨 해)

➡️따라서 2차원 배열을 사용해 평년일 때를 행[0], 윤년일 때를 행[1]로 해서 각 달의 날 수를 저장한다. 

==> 2월을 특별히 다루지 않고 날 수 계산 가능

 

✅윤년

 

✅실습2-12--지난 날 수 구하기

#include <stdio.h>

/*각 달의 날 수 저장한 이차원 배열*/
int mdays[][12] = {
  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, //평년(2월 28일)
  {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}  //윤년(2월 29일)
};

/*윤년인지 판별하는 함수*/
int isleap(int year)
{
  return year%4 == 0 && year%100 != 0  || year%400 == 0; //윤년일 조건.(윤년이면 1, 평년이면 0)
}

/*y년 m월 d일의 그 해 지난 날 수 계산*/
int dayofyear(int y, int m, int d)
{
  int i;
  int days = d; //날 수
  for(i=0; i<m; i++)  //0~m-1월까지의 날 수 더하기
  {
    days += mdays[isleap(y)][i-1];  //-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년의 %d일째입니다.\n", year, dayofyear(year, month, day));
    
    printf("다시?(1'''y/0'''n)");
    scanf("%d", &retry);
  } while(retry==1);

  return 0;
}

출력 결과>>

'Do it 알고리즘 입문[C]' 카테고리의 다른 글

헤더파일에 #ifndef  (0) 2022.01.21
구조체와 구조체의 배열  (0) 2022.01.20
[백준 C언어] 2512: 예산  (0) 2022.01.19
소수 찾기  (0) 2022.01.18
배열 연습문제 Q5-Q10  (0) 2022.01.17