백준 1308번: D-Day (Java)

won·2023년 3월 9일
0

알고리즘 문제풀이

목록 보기
22/32

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

진짜 나를 힘들게 하는 문제였다..
3시간 정도 고민하다 안돼서 그냥 풀이를 봤다
아 불행해..................................

밑에는 틀린 코드다.
20%에서 틀렸습니다가 뜬다.
dday 계산기로 비교하니 간간이 틀린 답이 나오곤 한다.

package problem_solved;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class n1308 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		st = new StringTokenizer(br.readLine());
		int year = Integer.parseInt(st.nextToken());
		int month = Integer.parseInt(st.nextToken());
		int day = Integer.parseInt(st.nextToken());

		st = new StringTokenizer(br.readLine());
		int f_year = Integer.parseInt(st.nextToken());
		int f_month = Integer.parseInt(st.nextToken());
		int f_day = Integer.parseInt(st.nextToken());

		boolean leap = false;

		int dday = 0;
		// gg 체크
		if (is_gg(year, month, day, f_year, f_month, f_day)) {
			bw.write("gg");
		} else {
			if (f_year - year > 0) { // 1년 이상 차이 날 경우
				if (f_month >= month && f_day >= day) { // 365일 이상 차이 날 경우
					for (int i = 0; i < (f_year - year); i++) {
						if (check_leap(year + i) == true) {
							dday += 366;
						} else {
							dday += 365;
						}

					}
					year = f_year;
				} else { // 365일 미만으로 차이 날 경우
					for (int i = 0; i < (f_year - year - 1); i++) {
						if (check_leap(year + i) == true) {
							dday += 366;
						} else {
							dday += 365;
						}
					}
					year = f_year - 1;
				}

			}

			if (month != f_month) {
				if(month>f_month) {
				dday += count_day(month, year) - day;
	
				day = 0;
				while (month != 12) {
					dday += count_day(month, year);
					++month;

				}
					year++;
					month = 1;
				}
				while (month != f_month) {
					dday += count_day(month, year);
					++month;
				}
				
			}
			
			if(month == f_month) {
				
				dday += f_day - day;
			}
			
			bw.write("D-" + dday);
		}
		bw.flush();
		bw.close();
		br.close();
	}

	// gg체크
	public static boolean is_gg(int year, int month, int day, int f_year, int f_month, int f_day) {

		if (f_year - year > 1000) {
			return true;
		} else if (f_year - year == 1000) {
			if (f_month > month) {
				return true;
			} else if (f_month == month) {
				if (f_day >= day) {
					return true;
				}
			}
		}
		return false;
	}

	// 달 별 날 수 세기
	public static int count_day(int month, int year) {
		int[] day = {0,31,28,31,30,31,30,31,31,30,31,30,31};
		if (month == 2) {
			if (check_leap(year)) {
				return 29;
			} 
		}
		return day[month];
	}

	// 윤년 체크
	public static boolean check_leap(int year) {
		if (year % 4 == 0) {
			if (year % 100 == 0) {
				if (year % 400 == 0) {
					return true;
				} else {
					return false;
				}
			}
			return true;
		}
		return false;
	}
}

다른 사람 풀이를 보니 모든 일수를 구해서 빼는 아주 간단한 방법을 쓰고 있었다...

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		st = new StringTokenizer(br.readLine());
		int year = Integer.parseInt(st.nextToken());
		int month = Integer.parseInt(st.nextToken());
		int day = Integer.parseInt(st.nextToken());

		st = new StringTokenizer(br.readLine());
		int f_year = Integer.parseInt(st.nextToken());
		int f_month = Integer.parseInt(st.nextToken());
		int f_day = Integer.parseInt(st.nextToken());

		boolean leap = false;

		int dday = 0;
		// gg 체크
		if (is_gg(year, month, day, f_year, f_month, f_day)) {
			bw.write("gg");
		} else {
			dday= check_days(f_year,f_month-1,f_day) - check_days(year,month-1,day);
			bw.write("D-" + dday);
		}
		bw.flush();
		bw.close();
		br.close();
	}
	public static int check_days(int year,int month,int day) {
		int[] m_day = {31,28,31,30,31,30,31,31,30,31,30,31};
		int days = 0;
		
		for(int i=0;i<year; i++) {
			days+=365;
			if(check_leap(i)==true) {
				days+=1;
			}
		}
		
		for(int i=0;i<month; i++) {
			days+=m_day[i];
			if(i==1&&check_leap(year)==true) {
				days+=1;
			}
		}
		
		days+=day;
		
		return days;
	}
	// gg체크
	public static boolean is_gg(int year, int month, int day, int f_year, int f_month, int f_day) {

		if (f_year - year > 1000) {
			return true;
		} else if (f_year - year == 1000) {
			if (f_month > month) {
				return true;
			} else if (f_month == month) {
				if (f_day >= day) {
					return true;
				}
			}
		}
		return false;
	}


	// 윤년 체크
	public static boolean check_leap(int year) {
		if (year % 4 == 0) {
			if (year % 100 == 0) {
				if (year % 400 == 0) {
					return true;
				} else {
					return false;
				}
			}
			return true;
		}
		return false;
	}
}

위에 내 코드에 무슨 문제가 있는지 알아보고 싶은데 알아보기 싫다.........
실버 5고 간단 날짜 계산 문제라 얕봤는데 너무 고통스러운 시간이였다.

profile
뭐라도 하자

0개의 댓글