코딩 문제

[코딩 문제] 연도 일자를 월/일로 계산하기

Joo.v7 2024. 8. 23. 15:47

문제 1) 1 ~ 365 사이의 수(일)를 읽어서 월과 일로 변환한 다음 출력하는 프로그램을 작성하시오. (윤년 무시)

ex) 입력: 40   ->   출력: February 9

import java.util.Scanner;

public class Whatday {
    public static void main(String[] args) {
        System.out.print("Enter a digit 1 between 365: ");
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        int dayNum = Integer.parseInt(line);

        int monthNum = 0;
        int[] daysInMonths = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        String[] monthNames = {"January", "Feburary", "March", "April", "May", "June", "July", "August", "Sepetember", "October", "November", "December"};

        for (int i : daysInMonths) {
            if (dayNum <= i) {
                break;
            }
            else {
                dayNum =  dayNum - i;
                monthNum++;
            }
        }
        System.out.printf("%s %d", monthNames[monthNum], dayNum);
        scanner.close();
    }
}

 

실행 결과

Enter a digit 1 between 365: 28
January 28
Enter a digit 1 between 365: 120
April 30

 

 

문제 2) 위 코드에서 1 ~ 365 이외의 입력을 받으면 예외 처리하는 코드를 작성하시오.

import java.util.Scanner;

public class Whatday {
    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            System.out.print("Enter a digit between 1 and 365: ");
            String line = scanner.nextLine();
            int dayNum = Integer.parseInt(line);

            if (dayNum < 1 || dayNum > 365) {
                throw new IllegalArgumentException("Out of Range of Valid Dates");
            }
            
            int monthNum = 0;
            int[] daysInMonths = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
            String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

            for (int i : daysInMonths) {
                if (dayNum <= i) {
                    break;
                } else {
                    dayNum = dayNum - i;
                    monthNum++;
                }
            }

            System.out.printf("%s %d", monthNames[monthNum], dayNum);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }
}

 

실행 결과

Enter a digit 1 between 365: 0
java.lang.IllegalArgumentException: Out of Range of Valid Dates
        at Whatday.main(Whatday.java:11)

 

 

문제3) 위 코드에서 윤년을 판별하는 코드 추가 (기존 코드에 연도를 입력받는 코드 추가)

import java.util.Scanner;

public class Whatday {
    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {

            // year 입력받고, 윤년 확인
            System.out.print("Enter a year number: ");
            String line = scanner.nextLine();
            int yearNum = Integer.parseInt(line);

            boolean isLeapYear = (yearNum % 4 == 0) && (yearNum % 100 != 0 || yearNum % 400 == 0);
            int maxDayNum = isLeapYear ? 366 : 365;

            if (isLeapYear) { 
                System.out.println("It's a Leap Year");
            } else {
                System.out.println("It's a Common Year");
            }

            // day 입력받고, 1 ~ maxDayNum 의 값인지 확인
            System.out.print("Enter a digit between 1 and " + maxDayNum + ": ");
            line = scanner.nextLine();
            int dayNum = Integer.parseInt(line);

            if (dayNum < 1 || dayNum > maxDayNum) {
                throw new IllegalArgumentException("Out of Range of Valid Dates");
            }

            int monthNum = 0;
            int[] daysInMonths = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // common year month
            int[] daysInLeapMonths = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // leap year month
            String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

            if (isLeapYear) {
                for (int i : daysInLeapMonths) {
                    if (dayNum <= i) {
                        break;
                    } else {
                        dayNum -= i;
                        monthNum++;
                    }
                }
            } else {
                for (int i : daysInMonths) {
                    if (dayNum <= i) {
                        break;
                    } else {
                        dayNum -= i;
                        monthNum++;
                    }
                }
            }
            System.out.printf("%s %d", monthNames[monthNum], dayNum);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }
}

 

실행 결과

Enter a year number: 2024
It's a Leap Year
Enter a digit 1 between 366: 366
December 31
Enter a year number: 2000
It's a Leap Year
Enter a digit 1 between 366: 359
December 24

 

 


 

 

출처: https://github.com/gikpreet/class-programming_with_java

 

GitHub - gikpreet/class-programming_with_java

Contribute to gikpreet/class-programming_with_java development by creating an account on GitHub.

github.com

'코딩 문제' 카테고리의 다른 글

[코딩 문제] 문자열 반전  (0) 2024.08.30
[코딩 문제] Palindrom  (0) 2024.08.23
[코딩 문제] 미로 탐색  (0) 2024.08.23
[코딩 문제] TicTacToe 게임  (0) 2024.08.23
[코딩 문제] Anagram  (0) 2024.08.23