ALGORITHM

[ALGORITHM] 다차원 배열(한 해의 경과 일 수 계산)

Jonny 2022. 1. 4. 15:59

# 다차원 배열

> 배열을 구성 요소로 하는 것이 2차원 배열, 2차원 배열을 구성 요소로 하는 것이 3차원 배열이고,
> 이런 배열을 보통의 배열(1차원 배열)과 구별하기 위해 다차원 배열이라고 한다.

## 한 해의 경과 일 수를 계산하는 프로그램

예를 들어 4월 15일의 경과 일 수를 구하면
-> 1월의 일 수 + 2월의 일 수 + 3월의 일 수 + 15

일반적으로 나타내면 m월 d일의 그 해의 경과 일 수는
->1월,2월....m-1월일 일 수의 합 + d

public class DayOfYear {
	// 각 달의 일수
	static int[][] mdays = {
			{31,28,31,30,31,30,31,31,30,31,30,31}, //평년
			{31,28,31,30,31,30,31,31,30,31,30,31}  //윤년
	};
	
	//서기 year년은 윤년인가?{윤년:1/평년:0}
	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 days = d;			//일 수
		
		for(int i=1; i<m; i++)  //1월~(m-1)월의 일 수를 더함
			days += mdays[isLeap(y)][i-1];
		return days;
	}

	
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);
		int retry;
		
		System.out.println("그 해 경과 일수를 구합니다.");
		
		do {
			System.out.println("년 :"); int year = stdIn.nextInt();
			System.out.println("월 :"); int month = stdIn.nextInt();
			System.out.println("일 :"); int day = stdIn.nextInt();
			
			System.out.printf("그 해 %d일째입니다.\n", dayOfYear(year, month, day));
			
			System.out.println("한 번 더 할까요? (1.예/0.아니오) : ");
			retry = stdIn.nextInt();
		} while (retry == 1);
	}

}

매개변수 (year)로 연도가 윤년이면 1을 반환하고, 평년이면 0을 반환하는 메서드 isLeap을 통해 윤년과 평년을 구분.

메서드 dayOfYear는 다음과 같은 순서로 경과 일 수를 구함.
1. days에 d의 값을 그대로 대입.
2. i를 1부터 m-1까지 증가하면서 days에 y년 i월의 일 수를 더함.(즉 , 1월부터 m-1월까지 일 수를 더함.)

따라서, y년 i월의 일 수는 mdays[isLeap(y)][i-1]로 구한다.

'ALGORITHM' 카테고리의 다른 글

이진검색[binary search]  (0) 2022.01.26
[ALGORITHM] 알고리즘 선형 검색  (0) 2022.01.05
[ALGORITHM] 소수의 나열  (0) 2021.12.31