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

DevSeoRex·2022년 6월 18일
0

Java

목록 보기
14/15

문제 : Calendar 클래스와 SimpleDateFormat 클래스를 이용해서 2020년의 매월 두 번째 일요일의 날짜를 출력하라

전체 코드

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Exercise10_01 {

	public static void main(String[] args) {
		Calendar sCal = Calendar.getInstance();
		Calendar eCal = Calendar.getInstance();
		boolean newMon = false;
		// 연도를 2020년 1월 1일로 설정 (Month는 -1 이므로 하나씩 낮게 설정)
		sCal.set(2020, 0, 1);
		eCal.set(2020, 1, 1);
		eCal.add(Calendar.DATE, -1);

		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd은 F번째 E요일 입니다.");

		int count = 0;
		int IS_SUNDAY = 0;
		IS_SUNDAY = sCal.get(Calendar.DAY_OF_WEEK);
		int END_DATE = eCal.get(Calendar.DATE);
		int i = 0;
		for (i = 1; i <= END_DATE; i++) {
			newMon = false;
			IS_SUNDAY = sCal.get(Calendar.DAY_OF_WEEK);

			if (IS_SUNDAY == 1) {
				count++;
			}

			if (count == 2) {
				Date date = new Date(sCal.getTimeInMillis());
				System.out.println(df.format(date));
				if (sCal.get(Calendar.MONTH) == 11) {
					break;
				} else {
					count = 0;
					sCal.add(Calendar.MONTH, 1);
					sCal.set(Calendar.DATE, 1);
					eCal.add(Calendar.MONTH, 1);
					eCal.set(Calendar.DATE, 1);
					eCal.add(Calendar.DATE, -1);
					newMon = true;
					END_DATE = eCal.get(Calendar.DATE);
					i = 1;
				}

			}

			if (newMon != true) {
				sCal.add(Calendar.DATE, 1);
			}

		}

	}

}

첫 번째로 맞이했던 문제가 2020년 3월 1일이 일요일인데, sCal(시작날짜)의 Date 값을 1로 증가시키면, 월이 바뀌었을때 2일 부터 시작해서 1일이 일요일이면 카운트로 잡아주지를 못했다.

그래서 newMon boolean 타입 변수를 선언해서, 월이 바뀔때마다 값을 true줘서, 다음 루프를 돌때 날짜를 더해주도록 작성하였다.

또, i는 계속 증가하기 때문에 i의 값을 달이 바뀌면 다시 1로 초기화 해서 계속 루프가 돌도록 해주었다.

중첩 if문을 사용해서 12월이 되서 두번 째 일요일이 출력되면, 2020년의 마지막 2번째 일요일이 되므로 즉시 반복문을 종료하도록 하였다.

출력

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

0개의 댓글