유익하셨다면 광고 한번씩만 클릭해주시면 감사하겠습니다.
// 년과 월을 입력받아 달력을 출력.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("년 : ");
int year = Integer.parseInt(reader.readLine());
System.out.print("월 : ");
int month = Integer.parseInt(reader.readLine());
// 핵심 : 해당 월 첫번째 날짜(1일)가 몇 요일인지 구하기.
// 1.1.1 ~ 2017.12.31, 2018.7.1 : 작년(2017 * 1(365 % 7)) +
// 올해 7월 1일 (31 + 28 + 31 + 30 + 31 + 30 + 1) + 작년까지 윤년의 발생 횟수 % 7 = 0 ~ 6
// 해당년이 윤년이 판별
boolean isLeapYear = false; // 평년
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
isLeapYear = true; // 윤년
}
// 작년(작년까지 평년의 횟수)
int lastYear = year - 1;
// 작년까지 발생한 윤년의 횟수
int leapYearCnt = (lastYear / 4) - (lastYear / 100) + (lastYear / 400);
// 해당년의 해당월의 1일까지의 일자 수 구하기
int dayOfYear = 1;
for(int i = 1; i < month; i++) {
switch(i) {
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
dayOfYear += 31; break;
case 2 :
if(isLeapYear) {
dayOfYear += 29;
}else {
dayOfYear += 28;
}
break;
default : dayOfYear += 30; break;
}
}
// 해당월의 첫번째 날짜의 요일
int dayOfWeek = (lastYear + leapYearCnt + dayOfYear) % 7; // 0 ~ 6
System.out.printf(" %d년 %02d월\n", year, month);
System.out.println("일\t 월\t 화\t 수\t 목\t 금\t 토");
// 공백 출력
for(int i = 0; i < dayOfWeek; i++) {
System.out.print(" \t");
}
int lastDay = 0;
if(month == 4 || month == 6 || month == 9 || month == 11) {
lastDay = 30;
}else if(lastDay == 2) {
lastDay = isLeapYear ? 29 : 28;
}else {
lastDay = 31;
}
// 날짜 출력
for(int i = 1; i <= lastDay; i++) {
System.out.print(i + "\t");
if((dayOfWeek + i) % 7 == 0) {
System.out.println();
}
}
'JAVA' 카테고리의 다른 글
자바 Method 예제2 (Method를 이용한 국어,영어,수학 점수 총점,평균 구하기) (0) | 2018.08.23 |
---|---|
자바 Method 예제 1 (Method를 이용한 숫자 비교 및 덧셈) (0) | 2018.08.23 |
자바 For문 예제) (For, Switch)을 이용한 10진수 -> 2진수, 8진수, 16진수 변경 (0) | 2018.08.21 |
자바 DoWhile 예제) (DoWhile)을 이용한 점수입력받아 총점, 평균 구하기. (0) | 2018.08.21 |
자바 While문 예제) (While)을 이용한 구구단 (0) | 2018.08.21 |