JAVA

자바 For문 예제) (For, Switch)이용한 달력 출력

KSJ IT 2018. 8. 22. 17:36

유익하셨다면 광고 한번씩만 클릭해주시면 감사하겠습니다.

반응형

// 년과 월을 입력받아 달력을 출력.

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

}

}

반응형