어떤 회사의 월급날이 매월 21일 일때, 두 날짜 사이에 월급날이 몇 번있는지 계산해서 반환하는 메서드를 작성 후 테스트 하라.
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Exercise10_03 {
static int payCheckCount(Calendar from, Calendar to) {
int monDiff = 0;
// 1. from 또는 to가 null이면 0을 반환한다.
if (from.equals(null) || to.equals(null)) {
return 0;
// 2. from와 to가 같고 날짜가 21일이면 1을 반환한다.
} else if (from.equals(to) && from.get(Calendar.DATE) == 21) {
return 1;
}
// 3. to와 from이 몇개월 차이인지 계산해서 변수 monDiff에 담는다.
if(from.get(Calendar.YEAR)<=to.get(Calendar.YEAR)) {
monDiff = ((to.get(Calendar.MONTH))-(from.get(Calendar.MONTH)));
// 3-1. from의 연도가 to의 연도보다 큰 경우, 0을 반환한다.
}else {
return 0;
}
// 4. monDiff가 음수이면 0을 반환한다.
if(monDiff <0) {
return 0;
}
// 5. 만일 from의 일(DAY_OF_MONTH)이 21일이거나 이전이고,
// to의 일(DAY_OF_MONTH)이 21일이거나 이후이면 monDiff의 값을 1 증가시킨다.
if((from.get(Calendar.DAY_OF_MONTH)<=21) && to.get(Calendar.DAY_OF_MONTH)>=21) {
monDiff++;
}
// 6. 만일 from의 일(DAY_OF_MONTH)이 21일 이후고
// to의 일(DAY_OF_MONTH)이 21일 이전이면 monDiff의 값을 1 감소시킨다.
if(from.get(Calendar.DAY_OF_MONTH)>21 && to.get(Calendar.DAY_OF_MONTH)<21) {
monDiff--;
}
return monDiff;
}
static void printResult(Calendar from, Calendar to) {
Date fromDate = from.getTime();
Date toDate = to.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.print(sdf.format(fromDate) + " ~ " +
sdf.format(toDate) + ":");
System.out.println(payCheckCount(from, to));
}
public static void main(String[] args) {
Calendar fromCal = Calendar.getInstance();
Calendar toCal = Calendar.getInstance();
fromCal.set(2020, 0, 1);
toCal.set(2020, 0, 1);
printResult(fromCal, toCal);
fromCal.set(2020, 0, 21);
toCal.set(2020, 0, 21);
printResult(fromCal, toCal);
fromCal.set(2020, 0, 1);
toCal.set(2020, 2, 1);
printResult(fromCal, toCal);
fromCal.set(2020, 0, 1);
toCal.set(2020, 2, 23);
printResult(fromCal, toCal);
fromCal.set(2020, 0, 23);
toCal.set(2020, 2, 21);
printResult(fromCal, toCal);
fromCal.set(2021, 0, 22);
toCal.set(2020, 2, 20);
printResult(fromCal, toCal);
}
}
이게 전체 코드인데 , 1~6번 조건은 책에 저자님께서 주석으로 달아 놓은 조건이다. 이것을 보고 코드로 구현만 하면 되는데, 나는 마지막 테스트 케이스인 2021-01-22 ~ 2020-3-21에서 출력값이 0이여야 함에도 2가 자꾸 나와서 3-2 조건을 추가했다.
from의 연도가 to의 연도보다 크다면 사이의 월급날을 계산하는 것에 의미가 없다.
from ~ to는 언제(작은 연도) ~ 언제(큰 연도) 까지 인데 논리적으로 맞지 않다.
따라서 from의 연도가 to의 연도보다 크면 0을 반환하게 해서, 정상적으로 출력을 하도록 작성하였다.