[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차원 배열 사용하지 않고 집가서 처음부터 다시 풀기...