『연도』 를 입력하세요 : 2021
『월』 을 입력하세요 : 7 /*
[ 2021년 7월 ]
일 월 화 수 목 금 토
============================
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
15 26 27 28 29 30 31
*/
줄이 지금 잘 안 맞는데 이런 식으로 년도와 월을 입력받아서 그 년/월의 달력을 만드는 것이다.
크게 로직을 그려보면 (여기서 입력년도와 월은 2021년 7월이라고 한다고 가정하면)
- 서기 1년 1월 1일로부터 2021년 7월 1일까지의 일 수를 구해 요일을 구한다.
- 2021년 7월은 총 몇 일로 이루어져 있는지 구한다.
- 총 일 수를 배열에 넣어 출력한다.
- 시작 요일에 따라 1일 앞에 적당한 공백을 준 후 날짜를 토요일마다 개행하며 출력한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test100
{
public static void main(String[] args) throws IOException
{
//BufferedReader 클래스 인스턴스 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 배열 선언 및 초기화
// 각 달이 담고 있는 마지막 날짜 (매 월의 최대 날짜)
int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,31 };
//System.out.println(days.length); //테스트 결과 : 12
//주요 변수 선언
int nalsu, y, m, w; //날수, 년, 월, 요일
do
{
System.out.print("『연도』 를 입력하세요 : ");
y = Integer.parseInt(br.readLine());
}
while (y < 1); //입력한 년도가 1보다 작으면 다시 반복
do
{
System.out.print("『월』 을 입력하세요 : ");
m = Integer.parseInt(br.readLine());
}
while (m<1 || m>12); //1월과 12월 사이의 수가 아니면 다시 반복
// 입력받은 년도에 해당하는 2월의 마지막 날 계산
if ((y%4==0) && (y%100!=0) || (y%400)==0) //윤년이라면
days[1] = 29;
else
days[1] = 28;
// 여기서 사실 else 구문은 현재 days 배열의 1번째 요소가
// 기본적으로 28로 입력되어있는 상태이기 때문에 생략이 가능한 구문이 된다.
// 1년 1월 1일 ~ 입력받은 년도 이전 년도의 12월 31일 까지의 년 수 계산
nalsu = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400; //★0년이 아닌 서기 1년으로 시작하므로
// 입력받은 년 월의 이전 월까지의 날 수 누적 연산
for (int i=0; i<m-1; i++)
{
nalsu += days[i];
}
// 확인
System.out.println(nalsu);
//입력받은 월의 1일
nalsu +=1; //++nalsu;
System.out.println(nalsu);
// 요일 산출
// : 입력 받은 월의 1일이 무슨 요일인지 확인하기 위한 연산
w = nalsu % 7; // 0 : 일요일 1: 월요일 2:화요일 3: 수요일 .... 6: 월요일
System.out.println(w);
// 출력 (달력그리기)
System.out.println();
System.out.printf("\t [%5d년 %2d월 ]\n", y, m);
System.out.println();
System.out.println(" 일 월 화 수 목 금 토");
System.out.println("=============================");
// 특정 요일부터 1일이 출발할 수 있도록 공백 발생(지정)
for (int i=1; i<=w; i++)
System.out.print(" ");
for (int i=1; i<=days[m-1]; i++)
{
System.out.printf("%4d",i);
w++;
if (w%7==0)
{
System.out.println(); //개행
}
}
//달의 마지막 날짜가 출력 형식을 모두 채웠을 경우 이미 일요일 개행이
//이뤄졌기 때문에 이 경우에는 추가 개행을 하지 않도록 처리
if(w%7!=0) System.out.println();
System.out.println("=============================");
}
}