본문 바로가기
TIL/JAVA

23.04.26

by J1-H00N 2023. 4. 26.

1일의 요일을 입력할 수 있는 달력 만들기

 

혼자 만든 것

package Javajigi.Calendar;

import java.util.Scanner;

public class PromptMaking_2 {
    private final static String PROMPT="cal> ";

    public void rumPrompt() {
        Scanner scanner = new Scanner(System.in);
        CalendarMaking_2 cal = new CalendarMaking_2();

        while (true) {
            System.out.println("년도를 입력해 주세요");
            System.out.print(PROMPT);
            int year = scanner.nextInt();
            System.out.println("달을 입력해 주세요");
            System.out.print(PROMPT);
            int month = scanner.nextInt();
            System.out.println("1일의 요일을 입력해 주세요");
            System.out.print(PROMPT);
            String day = scanner.next();
            if (month == -1) {
                break;
            }
            if (month > 12) {
                continue;
            }

            cal.printCalendar(year, month, day);
        }

        System.out.println("반복이 종료되었습니다.");

        scanner.close();
    }

    public static void main(String[] args) {
        PromptMaking_2 p = new PromptMaking_2();
        p.rumPrompt();
    }
}
package Javajigi.Calendar;

public class CalendarMaking_2 {
        private static final int[] MAX_DAYS = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        private static final int[] LEAP_MAX_DAYS = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        public boolean isLeepYear(int year) {
            return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
        }

        public int getMaxDaysOfMonth(int year, int month) {
            if (isLeepYear(year)) {
                return LEAP_MAX_DAYS[month - 1];
            } else return MAX_DAYS[month - 1];
        }

        public void printCalendar(int year, int month, String day) {
            System.out.printf("   <<%4d년%3d월>>\n", year, month);
            System.out.println(" SU MO TU WE TH FR SA");
            System.out.println("-----------------------");

            int maxday = getMaxDaysOfMonth(year, month);

            switch (day) {
                case "SU":
                    for (int i = 1; i <= maxday; i++) {
                        System.out.printf("%3d", i);
                        if (i % 7 == 0) {
                            System.out.println();
                        }
                    }
                    break;
                case "MO":
                    System.out.print("   ");
                    for (int i = 1; i <= maxday; i++) {
                        System.out.printf("%3d", i);
                        if (i % 7 == 6) {
                            System.out.println();
                        }
                    }
                    break;
                case "TU":
                    System.out.print("      ");
                    for (int i = 1; i <= maxday; i++) {
                        System.out.printf("%3d", i);
                        if (i % 7 == 5) {
                            System.out.println();
                        }
                    }
                    break;
                case "WE":
                    System.out.print("         ");
                    for (int i = 1; i <= maxday; i++) {
                        System.out.printf("%3d", i);
                        if (i % 7 == 4) {
                            System.out.println();
                        }
                    }
                    break;
                case "TH":
                    System.out.print("            ");
                    for (int i = 1; i <= maxday; i++) {
                        System.out.printf("%3d", i);
                        if (i % 7 == 3) {
                            System.out.println();
                        }
                    }
                    break;
                case "FR":
                    System.out.print("               ");
                    for (int i = 1; i <= maxday; i++) {
                        System.out.printf("%3d", i);
                        if (i % 7 == 2) {
                            System.out.println();
                        }
                    }
                    break;
                case "SA":
                    System.out.print("                  ");
                    for (int i = 1; i <= maxday; i++) {
                        System.out.printf("%3d", i);
                        if (i % 7 == 1) {
                            System.out.println();
                        }
                    }
                    break;
                default:
                    System.out.println("실패");
                    break;
            }
            System.out.println();
        }
}

 

좋은 예시

package Javajigi.Calendar;
import java.util.Scanner;
public class Promptex {

    public int parseDay(String week) {
        switch (week) {
            case "su":
                return 0;
            case "mo":
                return 1;
            case "tu":
                return 2;
            case "we":
                return 3;
            case "th":
                return 4;
            case "fr":
                return 5;
            case "sa":
                return 6;
            default:
                return -1;
        }
    }

    public void rumPrompt() {
        Scanner scanner = new Scanner(System.in);
        Calendarex cal = new Calendarex();

        while (true) {
            System.out.println("년도를 입력해 주세요.(exit : -1)");
            System.out.print("YEAR> ");
            int year = scanner.nextInt();
            if (year == -1)
                break;
            System.out.println("달을 입력해 주세요.");
            System.out.print("MONTH> ");
            int month = scanner.nextInt();
            if (month > 12 || month < 1) {
                System.out.println("잘못된 입력입니다.");
                break;
            }
            System.out.println("첫째 날의 요일을 입력하세요(su, mo, tu, we, th, fr, sa).");
            String str_weekday = scanner.next();
            int weekday = parseDay(str_weekday);
            if (weekday == -1) {
                System.out.println("잘못된 입력입니다.");
                break;
            }

            cal.printCalendar(year, month, weekday);
        }

        System.out.println("반복이 종료되었습니다.");

        scanner.close();
    }

    public static void main(String[] args) {
        Promptex p = new Promptex();
        p.rumPrompt();
    }
}
package Javajigi.Calendar;

public class Calendarex {

    private static final int[] MAX_DAYS = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    private static final int[] LEAP_MAX_DAYS = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    public boolean isLeepYear(int year) {
        return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
    }

    public int getMaxDaysOfMonth(int year, int month) {
        if (isLeepYear(year)) {
            return LEAP_MAX_DAYS[month - 1];
        } else return MAX_DAYS[month - 1];
    }


    public void printCalendar(int year, int month, int weekday) {
        System.out.printf("   <<%4d년%3d월>>\n", year, month);
        System.out.println(" SU MO TU WE TH FR SA");
        System.out.println("-----------------------");

        for (int i = 0; i < weekday; i++) {
            System.out.print("   ");
        }
        int maxday = getMaxDaysOfMonth(year, month);

        for(int i = 1; i <= maxday; i++) {
            System.out.printf("%3d", i);
            if ((i+weekday)%7 == 0) {
                System.out.println();
            }
        }

        System.out.println();
    }
}

 

날짜와 달만 입력하면 실제 달력과 같이 나오는 달력 만들기

 

혼자 만든 것

package Javajigi.Calendar;

import java.util.Scanner;

public class PromptMaking_3 {

    public void rumPrompt() {
        Scanner scanner = new Scanner(System.in);
        CalendarMaking_3 cal = new CalendarMaking_3();

        while (true) {
            System.out.println("년도를 입력해 주세요.(exit : -1)");
            System.out.print("YEAR> ");
            int year = scanner.nextInt();
            if (year == -1)
                break;
            System.out.println("달을 입력해 주세요.");
            System.out.print("MONTH> ");
            int month = scanner.nextInt();
            if (month > 12 || month < 1) {
                System.out.println("잘못된 입력입니다.");
                break;
            }

            cal.printCalendar(year, month);
        }

        System.out.println("반복이 종료되었습니다.");

        scanner.close();
    }


    public static void main(String[] args) {
        PromptMaking_3 p = new PromptMaking_3();
        p.rumPrompt();
    }
}
package Javajigi.Calendar;

public class CalendarMaking_3 {
    private static final int[] MAX_DAYS = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    private static final int[] LEAP_MAX_DAYS = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    public boolean isLeepYear(int year) {
        return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
    }

    public int firstDayOfNextYear(int year, int month) {
        int firstDayOfYear = 3;
        for (int i = 0; i < (year - 1902); i++) {
            if (isLeepYear((1902 + i + 1))) {
                firstDayOfYear += 2;
            } else {
                firstDayOfYear += 1;
            }
        }

        for (int j = 0; j < (month - 1); j++) {
            firstDayOfYear += ((getMaxDaysOfMonth(year, (1 + j)))%7);
        }
        if (isLeepYear(year)) firstDayOfYear -= 1;
        return (firstDayOfYear%7);
    }

    public int getMaxDaysOfMonth(int year, int month) {
        if (isLeepYear(year)) {
            return LEAP_MAX_DAYS[month - 1];
        } else return MAX_DAYS[month - 1];
    }

    public void printCalendar(int year, int month) {
        System.out.printf("   <<%4d년%3d월>>\n", year, month);
        System.out.println(" SU MO TU WE TH FR SA");
        System.out.println("-----------------------");

        int weekday = firstDayOfNextYear(year,month);

        for (int i = 0; i < weekday; i++) {
            System.out.print("   ");
        }
        int maxday = getMaxDaysOfMonth(year, month);

        for(int i = 1; i <= maxday; i++) {
            System.out.printf("%3d", i);
            if ((i+weekday)%7 == 0) {
                System.out.println();
            }
        }

        System.out.println();
    }
}

 

좋은 예시

package Javajigi.Calendar;
import java.util.Scanner;
public class Promptex {

    public void rumPrompt() {
        Scanner scanner = new Scanner(System.in);
        Calendarex cal = new Calendarex();

        while (true) {
            System.out.println("년도를 입력해 주세요.(exit : -1)");
            System.out.print("YEAR> ");
            int year = scanner.nextInt();
            if (year == -1)
                break;
            System.out.println("달을 입력해 주세요.");
            System.out.print("MONTH> ");
            int month = scanner.nextInt();
            if (month > 12 || month < 1) {
                System.out.println("잘못된 입력입니다.");
                break;
            }

            cal.printCalendar(year, month);
        }

        System.out.println("반복이 종료되었습니다.");

        scanner.close();
    }

    public static void main(String[] args) {
        Promptex p = new Promptex();
        p.rumPrompt();
    }
}
package Javajigi.Calendar;

public class Calendarex {

    private static final int[] MAX_DAYS = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    private static final int[] LEAP_MAX_DAYS = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    public boolean isLeepYear(int year) {
        return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
    }

    public int getMaxDaysOfMonth(int year, int month) {
        if (isLeepYear(year)) {
            return LEAP_MAX_DAYS[month];
        } else return MAX_DAYS[month];
    }


    public void printCalendar(int year, int month) {
        System.out.printf("   <<%d년 %d월>>\n", year, month);
        System.out.println(" SU MO TU WE TH FR SA");
        System.out.println("-----------------------");

        //get weekday automatically
        int weekday = getWeekDay(year, month);

        for (int i = 0; i < weekday; i++) {
            System.out.print("   ");
        }
        int maxday = getMaxDaysOfMonth(year, month);

        for(int i = 1; i <= maxday; i++) {
            System.out.printf("%3d", i);
            if ((i+weekday)%7 == 0) {
                System.out.println();
            }
        }

        System.out.println();
    }

    private int getWeekDay(int year, int month) {
        int syear = 1970;
        final int STANDARD_WEEKDAY = 4;

        int count = 0;

        for (int i = syear; i < year; i++) {
            int delta = isLeepYear(i) ? 366 : 365;
            count += delta;
        }

        for (int i = 1; i < month; i++) {
            int delta = getMaxDaysOfMonth(year, i);
            count += delta;
        }

        return (count + STANDARD_WEEKDAY)%7;
    }
}

 

이후 강의에서는 아직 배우지 않은 내용이 들어가있어 추후 내배캠에서 학습을 마친 뒤 이어서 할 예정이다.

'TIL > JAVA' 카테고리의 다른 글

23.04.28  (0) 2023.04.28
23.04.27  (0) 2023.04.27
23.04.25  (0) 2023.04.25
23.04.24  (0) 2023.04.24
23.04.21  (0) 2023.04.21