내가 생각했을때 문제에서 원하는부분
첫째 줄에 Month DD, YYYY HH:MM과 같이 주어진다.
Month는 현재 월이고, YYYY는 현재 연도이다.
숫자 네자리이다. DD, HH, MM은 모두 2자리 숫자이고, 현재 일, 시, 분이다.
Month는 January, February, March, April, May, June, July, August, September, October, November, December 중의 하나이고, 연도는 1800보다 크거나 같고, 2600보다 작거나 같다.
항상 올바른 날짜와 시간만 입력으로 주어진다.
첫째 줄에 문제의 정답을 출력한다.
절대/상대 오차는 10-9까지 허용한다.
내가 이 문제를 보고 생각해본 부분
윤년 확인 메서드:
의미: 주어진 연도가 윤년인지 확인한다.
조건: 연도가 4로 나누어 떨어지면서 100으로 나누어 떨어지지 않거나, 400으로 나누어 떨어질 경우 윤년이다.
각 월의 일 수를 반환하는 메서드:
의미: 주어진 연도의 각 월의 일 수를 배열로 반환한다.
윤년인 경우 2월의 일 수를 29로 설정한다.
월 이름을 숫자로 변환하는 메서드:
의미: 월 이름을 해당하는 숫자로 변환한다.
예를 들어, "January"는 0, "February"는 1로 변환된다.
잘못된 월 이름이 주어질 경우 -1을 반환한다.
메인
입력 처리: 사용자가 입력한 날짜와 시간을 읽고, 이를 파싱하여 월, 일, 연도, 시, 분으로 나눈다.
총 일 수 계산: 해당 연도의 모든 월의 일 수를 합산하여 총 일 수를 계산한다.
경과된 일 수 계산: 현재 날짜까지 경과된 일 수를 계산한다.
각 월의 일 수를 누적하여 현재 월의 일 수를 추가한다.
경과된 분 계산: 올해의 총 분과 현재까지 경과된 분을 계산한다.
퍼센트 계산: 경과된 분을 전체 분으로 나누어 퍼센트로 변환한다.
결과 출력: 소수점 15자리까지 결과를 출력한다.
코드로 구현
package baekjoon.baekjoon_25;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 1340번 문제
public class Main875 {
// 윤년인지 확인하는 메서드
public static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 각 월의 일 수를 반환하는 메서드
public static int[] getDaysInMonths(int year) {
int[] daysInMonths = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonths[1] = 29; // 2월의 일 수 설정
}
return daysInMonths;
}
// 월 이름을 숫자로 변환하는 메서드
public static int getMonthNumber(String month) {
switch (month) {
case "January": return 0;
case "February": return 1;
case "March": return 2;
case "April": return 3;
case "May": return 4;
case "June": return 5;
case "July": return 6;
case "August": return 7;
case "September": return 8;
case "October": return 9;
case "November": return 10;
case "December": return 11;
default: return -1; // 잘못된 월
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력 받기
String input = br.readLine();
String[] parts = input.split(" ");
// 월, 일, 연도, 시, 분 파싱
String monthStr = parts[0];
int day = Integer.parseInt(parts[1].replace(",", ""));
int year = Integer.parseInt(parts[2]);
String[] timeParts = parts[3].split(":");
int hour = Integer.parseInt(timeParts[0]);
int minute = Integer.parseInt(timeParts[1]);
// 해당 년도의 각 월의 일 수 구하기
int[] daysInMonths = getDaysInMonths(year);
// 올해의 총 일 수 계산
int totalDays = 0;
for (int days : daysInMonths) {
totalDays += days;
}
// 현재까지 경과된 일 수 계산
int daysPassed = 0;
int monthIndex = getMonthNumber(monthStr);
for (int i = 0; i < monthIndex; i++) {
daysPassed += daysInMonths[i];
}
daysPassed += day - 1; // 현재 월의 일 수 추가
// 현재까지 경과된 분 계산
double totalMinutes = totalDays * 24 * 60; // 올해의 총 분
double currentMinutes = daysPassed * 24 * 60 + hour * 60 + minute; // 지금까지 경과된 분
// 퍼센트 계산
double percentage = (currentMinutes / totalMinutes) * 100;
// 결과 출력
System.out.printf("%.15f\n", percentage);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.