[JAVA] 한 해의 경과 일 수 / 남은 일 수를 계산하는 알고리즘자료구조 & 알고리즘/알고리즘2023. 1. 25. 00:10
Table of Contents
Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다.
4월 15일을 예로 들면 그 해의 경과 일수를 구하면 아래와 같다.
- 1월의 일 수 + 2월의 일 수 + 3월의 일 수 + 15
m월 d일의 그 해 경과 일수는 아래와 같다.
- 1, 2, ..., m-1월의 일 수의 합 + d
그런데 2월의 일 수는 평년은 28일, 윤년은 29일로 해에 따라 달라진다.
윤년, 평년
지구가 태양 둘레를 한 바퀴 도는 일수는 정확히 365일이 아니다.
이를 조정하기 위해 4로 나누어 떨어지는 해를 윤년으로 하여 1년을 366일로 한다.
하지만 그래도 정확하기 않으므로 아래와 같은 규칙을 적용한다.
-해당 연도를 4로 나누어 떨어지면 우선 윤년으로 하고
-윤년 중에서 100으로 나누어 떨어지면 다시 평년으로 한다.
-하지만 평년 중에서 400으로 나누어 떨어지면 다시 윤년으로 한다.
윤년인지 평년인지 구분하는 조건문은 아래와 같다.
if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0) //이 조건식이 참이면 윤년이다. else //위 조건식이 참이 아니면 평년이다.
int[][] arr = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, //평년 arr[0][]
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} //윤년 arr[1][]
};
평년이면 위 코드처럼 2차원 배열을 선언하고 arr[0][]을 이용하고, 윤년이면 arr[1][]을 이용하면 된다.
한 해의 경과일 수를 계산하는 알고리즘
static int dayOfYear(int y, int m, int d)
{
int[][] arr = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int days = d;
if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0) for(int i = 1; i < m; ++i) days += arr[1][i-1]; //윤년일 때
else for(int i = 1; i < m; ++i) days += arr[0][i-1]; //평년일 때
return days;
}
실행 예제
public class Main{
static int dayOfYear(int y, int m, int d)
{
int[][] arr = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int days = d;
if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0) for(int i = 1; i < m; ++i) days += arr[1][i-1]; //윤년일 때
else for(int i = 1; i < m; ++i) days += arr[0][i-1]; //평년일 때
return days;
}
public static void main(String[] args) {
System.out.println(dayOfYear(2022, 3, 1)); //평년
System.out.println(dayOfYear(2023, 3, 1)); //평년
System.out.println(dayOfYear(2024, 3, 1)); //윤년
}
}
/*
60
60
61
*/
while문으로 작성
while 문으로 변수 i와 days 없이 구현
static int dayOfYear(int y, int m, int d)
{
int[][] arr = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0) while(--m != 0) d += arr[1][m-1];
else while(--m != 0) d += arr[0][m-1];
return d;
}
한 해의 남은 일 수를 계산하는 알고리즘
경과한 일 수를 구할 수 있다면 남은 일 수를 계산하는 것은 간단하다.
- 윤년이면 366일에서 경과일 수를 빼준다.
- 평년이면 365일에서 경과일 수를 빼준다.
static int leftDayOfYear(int y, int m, int d)
{
int[][] arr = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int days = d;
if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0) //윤년일 때
{
for(int i = 1; i < m; ++i) days += arr[1][i-1];
return 366 - days;
}
else //평년일 때
{
for(int i = 1; i < m; ++i) days += arr[0][i-1];
return 365 - days;
}
}
실행 예제
public class Main{
static int leftDayOfYear(int y, int m, int d)
{
int[][] arr = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int days = d;
if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0) //윤년일 때
{
for(int i = 1; i < m; ++i) days += arr[1][i-1];
return 366 - days;
}
else //평년일 때
{
for(int i = 1; i < m; ++i) days += arr[0][i-1];
return 365 - days;
}
}
public static void main(String[] args) {
System.out.println(leftDayOfYear(2022, 2, 28)); //평년
System.out.println(leftDayOfYear(2023, 2, 28)); //평년
System.out.println(leftDayOfYear(2024, 2, 28)); //윤년
}
}
/*
306
306
307
*/
'자료구조 & 알고리즘 > 알고리즘' 카테고리의 다른 글
[JAVA] 선형 검색(Linear Search), 보초법(Sentinel Method) (0) | 2023.01.26 |
---|---|
[JAVA] 날짜 계산기 알고리즘 (0) | 2023.01.26 |
[JAVA] n이하의 소수를 구하는 알고리즘 (0) | 2023.01.24 |
[JAVA] n진수 변환 알고리즘 (0) | 2023.01.23 |
[JAVA] 배열 비교, 복사, 역순으로 복사 알고리즘 (0) | 2023.01.22 |