(Java)자바의 정석 기초편 10장 3번 문제

DevSeoRex·2022년 6월 18일
0

Java

목록 보기
13/15

문제 내용

어떤 회사의 월급날이 매월 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을 반환하게 해서, 정상적으로 출력을 하도록 작성하였다.

출력

출처 : 자바의 정석 기초편(남궁성 저, 도우출판)

0개의 댓글