윤년 : 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 |