[백준] 1308번:D-Day

응갱·2022년 8월 28일
2

백준

목록 보기
17/56
post-thumbnail

https://www.acmicpc.net/problem/1308

📎문제

캠프에 오게 된 송유진은 캠프가 너무 지루해서 오늘로부터 캠프가 끝날 때 까지 며칠이나 남았는지 알아보고 싶었다. 그런데 캠프는 비상식적으로 길지도 몰라서 (윤년을 포함할지도 모른다) 손으로 하나하나 세기에는 힘들어 보였다.

더욱 정확한 계산을 위해, 유진이는 윤년이 정해지는 기준을 찾아보았고, 그것은 다음과 같았다.

  • 서력기원 연수가 4로 나누어떨어지는 해는 우선 윤년으로 한다. (2004년, 2008년, …)
  • 100으로 나누어떨어지는 해는 평년으로 한다. (2100년, 2200년, …)
  • 400으로 나누어떨어지는 해는 다시 윤년으로 한다. (1600년, 2000년, …)

그런데 캠프가 너무 길 경우, 사춘기인 유진이는 캠프에 무단으로 빠질지도 모른다.

📎입력

첫째 줄에 오늘의 날짜가 주어지고, 두 번째 줄에 D-Day인 날의 날짜가 주어진다. 날짜는 연도, 월, 일순으로 주어지며, 공백으로 구분한다. 입력 범위는 1년 1월 1일부터 9999년 12월 31일 까지 이다. 오늘의 날짜는 항상 D-Day보다 앞에 있다.

📎출력

오늘부터 D-Day까지 x일이 남았다면, "D-"를 출력하고 그 뒤에 공백 없이 x를 출력한다. 만약 캠프가 천년 이상 지속된다면 (오늘이 y년 m월 d일이고, D-Day가 y+1000년 m월 d일과 같거나 늦다면) 대신 "gg"를 출력한다. 오늘이 2월 29일인 경우는 주어지지 않는다.

📎코드

import java.util.Scanner;

public class pr1308 {
	// 윤년인지 판단할 메소드
	static int[] dayArray(int year) {
		int[] day = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
			day[1] = 29;
		return day;
	}

	// 1년1월1일~ 해당 날짜 까지의 날짜 수를 합할 메소드
	static long FindingDays(int year, int month, int day) {
		long days = 0;
		int[] date;
		for (int i = 1; i < year; i++) {
			date = dayArray(i);
			for (int j = 0; j < 12; j++) {
				days += date[j];
			}
		}
		date = dayArray(year);
		for (int i = 0; i < month-1; i++) {
			days += date[i];
		}
		days += day;
		return days;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 오늘의 날짜
		int Tyear = sc.nextInt();
		int Tmonth = sc.nextInt();
		int Tday = sc.nextInt();
		// D-Day인 날의 날짜
		int Dyear = sc.nextInt();
		int Dmonth = sc.nextInt();
		int Dday = sc.nextInt();

		// gg를 칠지 판단
		if ((Dyear - Tyear > 1000) || (Dyear - Tyear == 1000 && Dmonth > Tmonth)
				|| (Dyear - Tyear == 1000 && Dmonth == Tmonth && Dday >= Tday))
			System.out.println("gg");
		else {
			long T_findingdays = FindingDays(Tyear, Tmonth, Tday);
			long D_findingdays = FindingDays(Dyear, Dmonth, Dday);
			System.out.println("D-" + (D_findingdays - T_findingdays));
		}

	}

}

📎코드 해석

if문을 이용해 "gg"를 출력할지 판단한 후
1년 1월 1일~ 입력 받은 날짜까지의 날짜수를 계산해 D-day를 계산하도록 하였다.

🥔후기

지금 보니 Findingdays 메소드를 long형이 아닌 int형으로 해도 된다. 자릿수를 착각해서 long형으로 선언했다.

profile
🥔 한 덩이

1개의 댓글

comment-user-thumbnail
2023년 1월 5일

잘 보고 갑니다~~ 2023년 복 많이 받으세요^^

답글 달기