Problem Solving

[Java] Requirements Q042: 서기 1년 1월 1일부터 오늘까지의 날짜

Isaac S. Lee 2023. 7. 28. 13:56
package com.test.question;

import java.util.Date;
import java.util.Scanner;

public class Q042 {
	public static void main(String[] args) {
		/*
		● 요구사항
		서기 1년 1월 1일부터 오늘까지 며칠째인지 합을 구하시오.
		
		● 조건
		- Calendar 클래스 사용 금지
		
		● 출력
		2023년 7월 24일은 738,725일째 되는 날이고 월요일입니다.
		*/

		Scanner scan = new Scanner(System.in);
		
		int sum = 0;	// 누적 합계
		int inputYear;	// 입력 날짜(년)
		int inputMonth;	// 입력 날짜(월)
		int inputDay;	// 입력 날짜(일)
		String day = "";	// 요일
		
		// 오늘 날짜 입력 (년, 월, 일)
		System.out.printf("오늘 날짜(년): ");
		inputYear = scan.nextInt();
		
		System.out.printf("오늘 날짜(월): ");
		inputMonth = scan.nextInt();
		
		System.out.printf("오늘 날짜(년): ");
		inputDay = scan.nextInt();
		
		// 입력한 월의 전 월까지 누적
		for (int month = 1; month < inputMonth; month++) {
			switch(month) {
			case 1: case 3: case 5: case 7: case 8: case 10: case 12:
				sum = sum + 31;
				break;
			case 2:
				sum += isLeafYear(inputYear) ? 29 : 28;
				break;
			case 4: case 6: case 9: case 11:
				sum = sum + 30;
				break;
			}
		}
		
		// 입력한 일 누적
		sum = sum + inputDay;
		
		// 1년 1월 1일부터~작년 12월 31일까지 누적
		for (int year = 1; year < inputYear; year++) {
			if (isLeafYear(year)) {
				// 윤년
				sum = sum + 366;
			}
			else {
				// 평년
				sum = sum + 365;
			}
		}
		
		// 요일 계산
		if (sum % 7 == 0) {
			day = "일요일";
		}
		else if (sum % 7 == 1) {
			day = "월요일";
		}
		else if (sum % 7 == 2) {
			day = "화요일";
		}
		else if (sum % 7 == 3) {
			day = "수요일";
		}
		else if (sum % 7 == 4) {
			day = "목요일";
		}
		else if (sum % 7 == 5) {
			day = "금요일";
		}
		else {
			day = "토요일";
		}
		
		System.out.printf("%d년 %d월 %d일은 %,d일째 되는 날이고 %s입니다.", inputYear, inputMonth, inputDay, sum, day);
		
		scan.close();
	}
	
	private static boolean isLeafYear(int year) {
		if (year % 4 == 0) {
			if(year % 100 == 0) {
				if(year % 400 == 0) {
					// 윤년
					return true;
				}
				else {
					// 평년
					return false;
				}
			}
			else {
				// 윤년
				return true;
			}
		}
		else {
			// 평년
			return false;
		}
	}
}