import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public static void main(String[] args) throws NumberFormatException, IOException {
  
  // 년와 월을 입력 받아 달력을 출력
  BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
  
  System.out.print("년을 입력해주세요 : ");
  int year = Integer.parseInt(read.readLine());
  
  System.out.print("월을 입력해주세요 : ");
  int month = Integer.parseInt(read.readLine());
  
  // 해당 월 첫번째 날짜(1일)가 무슨 요일인지 구하기
  // 서기 2018년 태양력(그레고리력), 1년(365일) 일주일 7일 => 365 % 7 == 1
  /*
     1년 1월 1일 : 월요일
     2년 1월 1일 : 화요일
     3년 1월 1일 : 수요일
     4년 1월 1일 : 목요일(윤년 - 366일 => 366 % 7 == 2)
     5년 1월 1일 : 토요일
   */
  
  // 1.1.1 ~ 2018.7.1 : (2017*365) + 올해 7월 1일(31+ 28 + 31 + 30 + 31 + 30 + 1) % 7 = 0~6
  // 1.1.1 ~ 2018.7.1 : 작년(2017*1) + 작년까지 윤년의 발생 횟수
  //                    + 올해 7월 1일(31+ 28 + 31 + 30 + 31 + 30 + 1) + % 7 = 0~6


  String first_day="";
  int month_day =0;
  
  // 해당 년이 윤년인지 판별
  boolean isLeapYear = false; // 평년
  if(year % 4 ==0 && year % 100 !=0 || year % 400 ==0) {
   isLeapYear = true; // 윤년
  }
  // 작년
  int lastYear = year-1;
  // 작년까지 발생한 윤년의 횟수
  int leapYear_cnt = (lastYear/4) - (lastYear/100) + (lastYear/400);
  
  // 해당 월의 1일까지의 일자의 갯수
  int dayOfYear = 1;
  
  for(int i=1; i<month; i++) {
    switch(i) {
     case 1 :
     case 3 :
     case 5 :
     case 7 :
     case 8 :
     case 10 :
      dayOfYear+=31;
      break;
     case 2 :
      if(isLeapYear) {
       dayOfYear+=29; 
      }
      else {
       dayOfYear+=28;
      }
      break;
     default : dayOfYear+=30; break;
     
    }
      
    
  }  // 해당 월의 첫번째 날짜의 요일
    int dayOfweek = (lastYear + leapYear_cnt + dayOfYear)%7;
    

    // 월에 따른 날짜 출력 조건
    int lastDay = 0;
    if(month == 4 || month == 6 || month == 9 || month == 11) {
     lastDay = 30;
    }
    else if(month == 2) {
     lastDay = isLeapYear ? 29 : 28;
    }
    else {
     lastDay = 31;
    }
    
    System.out.printf("%d년 %02d월\n", year, month);
    System.out.printf("일\t월\t화\t수\t목\t금\t토\n");
    // 공백 출력
    for(int i =0; i<dayOfweek; i++) {
     System.out.print("\t");
    }
    // 날짜 출력
    for(int i = 1; i<=lastDay; i++) {
     System.out.print(i + "\t");
     if((dayOfweek + i)%7 ==0) {
      System.out.println();
     }
    }
    
    /*switch(dayOfweek) {
     case 0 : first_day = "일요일"; break;
     case 1 : first_day = "월요일"; break;
     case 2 : first_day = "화요일"; break;
     case 3 : first_day = "수요일"; break;
     case 4 : first_day = "목요일"; break;
     case 5 : first_day = "금요일"; break;
     case 6 : first_day = "토요일"; break;
    }*/

    
  
 }

+ Recent posts