본문 바로가기

카테고리 없음

배열을 활용한 만능달력 (●'◡'●)

 

 

『연도』 를 입력하세요 : 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월 1일로부터 2021년 7월 1일까지의 일 수를 구해 요일을 구한다.
  2. 2021년 7월은 총 몇 일로 이루어져 있는지 구한다.
  3. 총 일 수를 배열에 넣어 출력한다. 
  4. 시작 요일에 따라 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("=============================");








		
	 }
 }