본문 바로가기
Coding/Java

003. Java의 기본 자료구조(다차원배열(달력,날짜계산))

by hyun-am 2020. 1. 8.

달력 만들기

평년 윤년

 

먼저 달력은 평년과 윤년이 있습니다. 따라서 이를 구분하기 위해 이차원 배열을 하나 만듭니다.

 

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

 

1308번: D-Day

첫째 줄에 오늘의 날짜가 주어지고, 두 번째 줄에 D-Day인 날의 날짜가 주어진다. 날짜는 연도, 월, 일순으로 주어지며, 공백으로 구분한다. 입력 범위는 1년 1월 1일부터 9999년 12월 31일 까지 이다. 오늘의 날짜는 항상 D-Day보다 앞에 있다.

www.acmicpc.net

 

코드는 아래와 같습니다.

 

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)));
		}
	}
}

댓글