IT/알고리즘

1일 1코딩

So1_b 2022. 4. 8. 23:28
/**
 * 83p
 * 한 해 경과일수 구하기 프로그램+
 * Q8~9문제
 * 복습
 * 
 * 
 */
package basic.data_structure_repeat;
import java.util.Scanner;

public class DayOfYear {
	
	//static int[][] mday=new int[2][12];
	static int[][] mdays= {
			{31,28,31,30,31,30,31,31,30,31,30,31}, //평년 4,100으로 나눠떨어지는 해
			{31,29,31,30,31,30,31,31,30,31,30,31} //윤년  4,400으로 나눠떨어지는 해
	};
	
	static int isLeap(int year) {
		return (year%4==0 && year%100!=0 || year%400==0)?1:0;
	}
	//서기 y년 m월 d일의 그 해 경과 일수를 구함.
	static int dayOfYear(int y, int m, int d) {
		int sum=0;
		//배열 인덱스 0~m-2까지 접근
		m-=2;
		while(m>=0) { //조건부도 확인하고
			
			sum+=mdays[isLeap(y)][m]; //직접 배열에 접근하는 코드도 살펴보기!
			System.out.println(sum+"일"); //1월일때 문제가 발생...? 음수가 나오니까
			m--;
		};
		
		return sum+=d;
//		int days=d; //일 수
//		
//		for(int i=1;i<m;i++) {
//			days+=mdays[isLeap(y)][i-1]; //평년이면 0 윤년이면 1
//		}
//		return days;
	}
	
	static int leftDayOfYear(int y, int m, int d) {
		int sum=0;
		//배열 인덱스 m~11까지 접근
		while(m<12) {
			sum+=mdays[isLeap(y)][m];
			m++;
		}
		sum+=mdays[isLeap(y)][m-1]-d;
		return sum;
	}
	public static void main(String[] args) {
		Scanner stdIn=new Scanner(System.in);
		int retry;
		
		
		System.out.println("그 해 경과 일수를 구합니다.");
		
		do {
			System.out.print("년: "); int year=stdIn.nextInt(); //년
			System.out.print("월: "); int month=stdIn.nextInt();	 //월
			System.out.print("일: "); int day=stdIn.nextInt();      //일
			
			System.out.printf("그 해 %d일째입니다.\n",dayOfYear(year,month, day));
			System.out.printf("%d일 남았습니다.\n",leftDayOfYear(year,month,day));
			
			System.out.print("한 번 더 할까요? (1.예/2.아니오)");
			retry=stdIn.nextInt();
		}while(retry==1);
	}
}