[Java]/Programing practice

105 - Java 만년 달력 : 사용자가 입력한 년도와 월의 달력을 출력하는 프로그램 (내 풀이!)

Jelly-fish 2023. 9. 11. 14:51

 

/*=============================================
	■■■ 만년 달력 ■■■	
	- 다음과 같은 기능의 프로그램을 구현한다.
===============================================*/


// 실행 예)
// 『연도』를 입력하세요 : 2023
// 『월』을 입력하세요   : 9


/*
	[ 2023년 9월 ]

 일  월  화  수  목  금  토
============================
                       1   2
   3   4   5   6   7   8   9
  10  11  12  13  14  15  16
  17  18  19  20  21  22  23
  24  25  26  27  28  29  30
============================
계속하려면 아무 키나 누르세요...
*/


import java.util.Scanner;


public class Test105
{
	public static void main(String[] args)
	{
		// 1. 변수 선언
		int inputYear;
		int inputMonth;
		int[] monthDay = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
		int[][] calendar = new int[6][7];
		int n = 1;
		int totalYear = 0;
		int totalMonth = 0;
		int totalDay = 0;
		int intDayOfWeek;

		Scanner sc = new Scanner(System.in);

		System.out.print("『연도』를 입력하세요 : ");
		inputYear = sc.nextInt();

		System.out.print("『월』을 입력하세요   : ");
		inputMonth = sc.nextInt();
		

		// 윤년일 경우, 2월의 총 일수를 28 → 29로 변경.
		if ((inputYear % 4 == 0) && (inputYear % 100 != 0) || (inputYear % 400 == 0))
		{
			monthDay[1] = 29;
		}


		// 입력 년도 이전 년도까지의 총 일수를 구하는 for문을 실행.
		for (int i = 1; i < inputYear; i++)
		{
			if ((i % 4 == 0) && (i % 100 != 0) || (i % 400 == 0))
			{
				totalYear += 366;
			}

			else
			{
				totalYear += 365;
			}
		}

		// 입력 월의 이전 월까지의 일수를 더함 + 1일이 바로 지금 구하려는 달력의
		// 1일. 즉, 사용자가 입력한 달의 1일의 요일을 구하기 위해 이전 월의 일수 + 1을 한다.
		// i는 0부터 시작하고, 입력한 월의 전 월까지만 일수를 더해야 하기 때문에 inputMonth에서 1을 빼준다.
		// ex) 4월 입력 → 3월까지의 월 일수를 더해야 하므로, i = 0 ~ 2(=4-2).
		
		// 입력 년도 이전 달까지의 총 일수를 더하는 for문을 실행.
		for (int i = 0; i < inputMonth - 1 ; i++)
		{
			totalMonth += monthDay[i];
		}

		// 입력 년도의 1일의 날짜를 알기 위해, 1일까지의 총 일수를 구함.
		totalMonth += 1;

		// 입력 년도, 입력 월의 총 일수를 더하고, 총 일수 totalDay에 저장.
		totalDay = totalYear + totalMonth;

		// 총 일수를 7로 나누어 무슨 요일인지를 알아낸다.
		// 0 = 일요일, 1 = 월요일, 2 = 화요일, 3 = 수요일, 4 = 목요일, 5 = 금요일, 6 = 토요일

		intDayOfWeek = totalDay % 7;
		System.out.printf("요일 수 : %3d\n", intDayOfWeek);


		// intDayOfWeek이 0이면 calendar[0][0] 시작	→ 일
		// intDayOfWeek이 1이면 calendar[0][1] 시작	→ 월
		// intDayOfWeek이 2이면 calendar[0][2] 시작 → 화
		// intDayOfWeek이 3이면 calendar[0][3] 시작 → 수
		
		// 사용자가 입력한 달의 일수만큼 n은 증가하면서 달력을 찍어낸다.
		// monthDay[입력한 달 - 1]
		// ==>> 9월 입력했을 경우, monthDay[8] = 30. (인덱스 0부터 시작하므로...)
		
		
		
		for (int j = 0; j < 6; j++)
		{
			if (j == 0)
			{
				for (int i = intDayOfWeek; i < 7; i++)
				{
					calendar[j][i] = n;
					n++;
				}
			}

			else if (j >= 1)
			{
				for (int i = 0; i < 7; i++)
				{
					calendar[j][i] = n;
					n++;
				}
				if (n > monthDay[inputMonth-1])
				{
					break;
				}
			}
		}





		System.out.println(" 일  월  화  수  목  금  토 ");
		System.out.println("============================");

		for (int j = 0; j < 6; j++)
		{
			
			// j는 0. 즉, 달력의 첫 번째 행일 때 요일이 금요일이면, 0~4까지 공백 출력 후 일수를 출력.
			if (j == 0)
			{
				for (int i = 0; i < intDayOfWeek; i++)	// 공백 출력.
				{
					System.out.print("    ");
				}
				for (int i = intDayOfWeek; i < 7; i++)	// 1부터 일수를 출력. 
				{
					System.out.printf("%4d", calendar[j][i]);
				}
			}
			else if (j >= 1)
			{
				for (int i = 0; i < 7 ; i++)
				{
					if (i == 0)
					{
						System.out.println();
					}
					
					


					if (calendar[j][i] > monthDay[inputMonth-1])
					{
						
						break;
					}//end for if

					else
					{
						if (calendar[j][i] != 0)
						{
							System.out.printf("%4d", calendar[j][i]);

						}
						/*




						 일  월  화  수  목  금  토
						============================
											   1   2
						   3   4   5   6   7   8   9
						  10  11  12  13  14  15  16
						  17  18  19  20  21  22  23
						  24  25  26  27  28  29  30
						  31						← j = 5가 되고(마지막 줄), 일수의 값이 마지막 날일 때
						============================       개행을 실행하는 부분 ↓
						
						이 줄을 실행하지 않으면...
						31일 때 개행을 실행하지 않아, 31======처럼 출력된다.
						그렇다고 해서, 달력의 맨 마지막 줄 =====================을 출력할 때
						\n을 써버리면...
						

						 일  월  화  수  목  금  토
						============================
											   1   2
						   3   4   5   6   7   8   9
						  10  11  12  13  14  15  16
						  17  18  19  20  21  22  23
						  24  25  26  27  28  29  30
						  								j = 5일 때 일수 값이 없음에도 불구하고 개행해 버린다...
						============================
			
						*/

						if ((calendar[j][i] == monthDay[inputMonth-1]) && (j == 5))
						{
							System.out.println();
						}
			

					}//end for else
	
					
				}//end for i(0~6)
			}//end for if(j>=1)
		
			

		}// end for j

		System.out.println("============================");

	}
}

 

 

변수 선언
import java.util.Scanner;


public class Test105
{
	public static void main(String[] args)
	{
		// 1. 변수 선언
		int inputYear;		//-->> 사용자가 입력한 년도를 저장할 변수.
		int inputMonth;		//-->> 사용자가 입력한 월을 저장할 변수.
		int[] monthDay = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        // ↑ 1년의 1월부터 ~ 12월까지의 일수를 각 방에 정수형으로 저장한 배열.
        //   평년 (2월 = 28일)을 기본값으로 사용.
		
        int[][] calendar = new int[6][7];
       /*
        일 월 화 수 목 금 토                       
        0  0  0  0  0  0  0    
        0  0  0  0  0  0  0    
        0  0  0  0  0  0  0
        0  0  0  0  0  0  0
        0  0  0  0  0  0  0
        0  0  0  0  0  0  0
        
        일 월 화 수 목 금 토 
        0  0  0  0  0  0  1    토요일이 1일이고,      
        2  3  4  5  6  7  8    31이 마지막 날일 경우  
        9  10 11 12 13 14 15   끝 날짜들이 뒤로 밀려나기 때문에
        15 16 17 18 19 20 21   행을 6으로 설정.
        22 23 24 25 26 27 28    
        29 30 31             ←---
        */
        
        
		int n = 1;          //-->> 1 씩 증가하면서 월의 일수를 찍을 변수 n.
		int totalYear = 0;  //-->> 전년도까지의 총 일수를 저장할 변수 totalYear.
		int totalMonth = 0; //-->> 이전 월까지의 총 일수를 저장할 변수 totalMonth. 
		int totalDay = 0;   //-->> (전년도 일수)+(이전 월)+(입력한 월의 1일)
                            //      까지의 합을 저장할 변수.
		int intDayOfWeek;   //-->> 총 일수를 7로 나누어, 요일을 구할 변수.
                            //-->> 0 : 일요일, 1 : 월요일, 2 : 화요일, 3 : 수요일
                            //     4 : 목요일, 5 : 금요일, 6 : 토요일

 

사용자에게 년도, 월을 입력받고 윤년을 입력했을 경우 monthDay의 2월달 요소[1]를 29로 변경.
// ↑ 위에 import java.util.Scanner; 임포트 했음~!!!

		Scanner sc = new Scanner(System.in);        //-->> 스캐너 객체 생성

		System.out.print("『연도』를 입력하세요 : "); //-->> 사용자에게 년도 입력 받기.
		inputYear = sc.nextInt();

		System.out.print("『월』을 입력하세요   : "); //-->> 사용자에게 월 입력 받기.
		inputMonth = sc.nextInt();
        
        
		// 윤년일 경우, 2월의 총 일수를 28 → 29로 변경.
		// int[] monthDay = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
		if ((inputYear % 4 == 0) && (inputYear % 100 != 0) || (inputYear % 400 == 0))
		{
			monthDay[1] = 29;
		}

 

 

입력 년도 이전 년도의 총 일수 + 입력 월의 이전 월의 총 일수
	// 『 ① 입력 년도 이전 년도까지의 총 일수를 구하는 for문을 실행. 』******************
		
        for (int i = 1; i < inputYear; i++) 
		{
        	// ① i = 1 ~ (inputYear - 1)  1년부터 ~ 입력 년도의 이전 년도까지
			if ((i % 4 == 0) && (i % 100 != 0) || (i % 400 == 0))
			{
				totalYear += 366;   //-->> [ 윤년(2월 29일)이면? 년도 총 일수 + 366! ]
			}

			else
			{
				totalYear += 365;   //-->> [ 평년(2월 28일)이면? 년도 총 일수 + 365! ]
			}
		}
//**********************************************************************************
		
		
	// 『 ② 입력 년도 이전 년도까지의 총 일수를 구하는 for문을 실행. 』******************
        
        
		
        // i는 0부터 시작하고, 입력한 월의 전 월까지만 일수를 더해야 하기 때문에 inputMonth에서 1을 빼준다.
		// ex) 4월 입력 → 3월까지의 월 일수를 더해야 하므로, i = 0 ~ 2(=4-2).
		for (int i = 0; i < inputMonth - 1 ; i++)
		{
			totalMonth += monthDay[i];
		}

//**********************************************************************************

 

 

ing ... 

2차원 배열 사용하지 않고 집가서 처음부터 다시 풀기...