달력 만들기
평년 윤년
먼저 달력은 평년과 윤년이 있습니다. 따라서 이를 구분하기 위해 이차원 배열을 하나 만듭니다.
static int[][]mDays = {
{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31},
};
윤년 조건
기본적으로 4로 나누어 떨어지면 윤년입니다. 하지만 추가적인 규칙이 있습니다.
4로 나누어 떨어지지만 100으로 나누어 떨어지면 평년입니다.
하지만, 400으로도 나누어 떨어지면 윤년입니다.(예)2000년, 2400년
따라서 아래와 같이 나타낼 수 있습니다.
static int leapYear(int year){
return (year % 4 == 0 && year % 100 != 0 || year % 400 ==0) ? 1 : 0;
}
그러면 이것을 활용하여 날짜 경과를 구할 수 있는 메소드를 만들 수 있습니다.
static int dayCount(int y, int m, int d) {
int days = d;
for(int i=1;i<m;i++) {
days += mDays[leapYear(y)][i-1];
}
return days;
}
이 코드를 활용하면 연도, 달, 일을 입력하면 1월1일부터 몇년이 경과했는지 확인할 수 있습니다.
응용해서 백준알고리즘 1308번째 문제를 풀어보겠습니다.
문제 : https://www.acmicpc.net/problem/1308
코드는 아래와 같습니다.
package doit;
import java.util.Scanner;
public class Q1308 {
static int[][]mDays = {
{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31},
};
static int leapYear(int year){
if(year==1) return 0;
else
return (year % 4 == 0 && year % 100 != 0 || year % 400 ==0) ? 1 : 0;
}
static int dayCount(int y, int m, int d) {
int days = d;
for(int i=1;i<m;i++) {
days += mDays[leapYear(y)][i-1];
}
return days;
}
static int leftDayOfYear(int y, int m, int d) {
int days = (leapYear(y)==1 ? 366 : 365);
while(m>1) {
d += mDays[leapYear(y)][m-1];
m--;
}
return days-d;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int y1 = sc.nextInt();
int m1 = sc.nextInt();
int d1 = sc.nextInt();
int days1 = dayCount(y1, m1, d1);
int y2 = sc.nextInt();
int m2 = sc.nextInt();
int d2 = sc.nextInt();
int days2 = dayCount(y2, m2, d2);
int y_count = y2-y1;
int y_days1 = 0;
int y_days2 = 0;
for(int i=0;i<y1;i++) {
int days = (leapYear(i)==1 ? 366 : 365);
y_days1+=days;
}
for(int i=0;i<y2;i++) {
int days = (leapYear(i)==1 ? 366 : 365);
y_days2+=days;
}
if((y2-y1)>=1000&&days1<=days2) {
System.out.println("gg");
}else {
System.out.println("D-"+((y_days2+days2)-(y_days1+days1)));
}
}
}
'Coding > Java' 카테고리의 다른 글
002. Java의 기본 자료구조(소수나열) (0) | 2020.01.07 |
---|---|
001. Java의 기본 자료구조(reverse) (0) | 2020.01.06 |
000. Java의 기본 자료구조(배열) (1) | 2020.01.06 |
댓글