본문 바로가기

IT/문제

달력만들기

MyCalendar.java

MyMain_달력.java

윤년 : 4년에 한번씩 2월이 29일만 있는것

(윤년을 안구할 경우 달력날짜가 엉터리가 됨)


보통은 음력 휴일때문에 많이 계산한다고 함...


boolean isYoon() { //조건1 //조건2 return (year%400==0) || (year%4==0 && year%100!=0); /*

year%100!=0 100 이 2로도 나누어 떨어지는 년도가 생기니까 넣음 4년씩 올라가야되는데 2년씩 올라가는 년도에도 나누어 떨어지는 년도가 생김. 그거를 방지하기 위해서 넣음( year%100!=0 )

100으로 나누어 떨어지면 평년. year%100!=0 != 나누어 떨어지지 않는게 조건 즉, ① 서력 기원 연수가 4로 나누어 떨어지는 해는 우선 윤년으로 하고, ② 그 중에서 100으로 나누어 떨어지는 해는 평년으로 하며, */ }

package mymain;

import java.util.Scanner;

import myutil.MyCalendar;

public class MyMain_달력 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int year = 2018;
		int month = 6;
		Scanner scan = new Scanner(System.in);
		
		MyCalendar mc = new MyCalendar();
		
		while(true)
		{
			System.out.print("년  월 : ");
			year = scan.nextInt();
			month = scan.nextInt();
			
			mc.setDate(year, month);
			mc.display();
			
		}
		
		

	}

}
package myutil;

import java.util.Calendar;

public class MyCalendar {
    //                      1  2  3  4  5  6  7  8  9  10 11 12 <= month
	//                      0  1  2  3  4  5  6  7  8  9  10 11 <= month-1
	int []  month_array = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	int year;
	int month;
	int [][] cal_array;
	
	public void setDate(int year,int month)
	{
		this.year = year;
		this.month = month;
		
		cal_array = new int[6][7];
		
		make_calendar();
	}

	boolean isYoon() {
		        // 조건1     ||       조건2 
		return (year%400==0) || (year%4==0 && year%100!=0);
	}
	
	int getYoil() {
		//요일구하기
		Calendar c = Calendar.getInstance();
		c.set(year, month-1 , 1);
		
		int yoil = c.get(Calendar.DAY_OF_WEEK) - 1;
		return yoil;
	}
	
	//1-1-1기준으로 해당년월의 1일까지의 총날수 계산
	int getYoil_2() {
		
		//요일 = 총날수%7(0~6)
		
		int total_days = 0;
		
		total_days = (year-1) * 365;//전년도까지의 일수
		//윤년의 횟수 추가
		total_days = total_days + ( (year-1)/400 + (year-1)/4 -(year-1)/100 );
		
		
		//윤년체크 => 2월의 마지막날을 29 or 28설정
		if(isYoon()) //윤년이면
			month_array[1] = 29;
		else
			month_array[1] = 28;
				
		//전월까지의 합
		for(int i=0;i< month-1;i++) {
			total_days = total_days + month_array[i];
		}
		
		//기준달 전달의 말일까지 구하결과=>현재달 1일로 계산
		total_days = total_days + 1;
		
		
		
		return total_days%7;
	}
	
	private void make_calendar() {
		// TODO Auto-generated method stub
		//요일구하기
		int yoil = getYoil_2();
				
		int week = 0;
		
		
		//윤년체크 => 2월의 마지막날을 29 or 28설정
		if(isYoon()) //윤년이면
			month_array[1] = 29;
		else
			month_array[1] = 28;
		
		//이전달 날짜 채우기
		int prev_yoil = yoil-1;
		int last_index = month-2; //이전달 첨자
		
		last_index = (last_index < 0)  ? last_index+12 : last_index;
		int last_day = month_array[last_index];//이전달의 마지막날짜
		for(int i=prev_yoil ; i>=0;i--) {
			cal_array[0][i] = last_day--;
		}
		
		
		
		//날짜 채우기
		for(int i = 1 ;i <= month_array[month-1]; i++ ){
			
			cal_array[week][yoil] = i;
			
			yoil++;//열증가
			if(yoil > 6) {
				week++;
				yoil=0;
			}
		}
	}
	
	public void display() {
		//타이틀(요일)
		//0값처리
		
		
		for(int i=0;i<6;i++) {
			
			for(int k=0;k<7;k++) {
				System.out.printf("%4d", cal_array[i][k]);
			}
			
			System.out.println();
		}
		
	}
	
	
	
	
}


'IT > 문제' 카테고리의 다른 글

공 상하좌우로 움직이기  (0) 2018.05.11
2차원 배열  (0) 2018.05.07
rotate_left_90  (0) 2018.05.02
마방진  (0) 2018.05.02
로또  (0) 2018.05.01