본문 바로가기

알고리즘(백준 등) 공부/백준(자바)

백준 1308번: D-Day

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

 

윤년을 고려하여 시작 날짜부터 종료 날짜까지 몇일 남았는지 계산하는 문제이다. 입력은 1년 1월 1일 부터 시작하며 9999년 12월 31일이 마지막이다. 만약 1000년 이상 차이난다면 gg를 출력하고, 1000년 미만이면 남은 일의 수를 출력한다.

 

1000년 이상 날짜 차이가 나는지 확인을 먼저 하고 시작 날짜와 남은 날짜를 1년 1월 1일 기준으로 몇일 지났는지 계산한 후, 둘의 차이를 빼는 방식으로 구현하였다. 날짜를 구하기 위해 윤년인지 확인이 필요하며 윤년이면 1년을 366일을, 아니면 365일을 기준으로 한다.

private static boolean isLeapYear(int year) {
    if (year % 400 == 0) {
        return true;
    }
    if (year % 100 == 0) {
        return false;
    }
    return year % 4 == 0;
}

private static int daysInYear(int year) {
    return isLeapYear(year) ? 366 : 365;
}

 

 

각 달의 일의 수는 정해져 있으나, 2월의 경우 윤년이면 29일, 아니면 28일이 된다.

private static int daysInMonth(int year, int month) {
    int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (month == 2 && isLeapYear(year)) {
        return 29;
    }
    return days[month];
}

 

 

윤년인지, 몇월인지 등을 계산하여 총 지난 일 수를 계산한다. 종료 날짜와 시작 날짜의 차가 남은 일수가 된다.

private static long toDays(int year, int month, int day) {
    long total = 0;
    for (int y = 1; y < year; y++) {
        total += daysInYear(y);
    }
    
    for (int m = 1; m < month; m++) {
        total += daysInMonth(year, m);
    }
    
    total += day;
    return total;
}

 

 

최종 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class DDay1308 {
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int startYear = Integer.parseInt(st.nextToken());
        int startMonth = Integer.parseInt(st.nextToken()), startDay = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine());
        int endYear = Integer.parseInt(st.nextToken());
        int endMonth = Integer.parseInt(st.nextToken()), endDay = Integer.parseInt(st.nextToken());
        br.close();
        
        
        if (endYear - startYear > 1000) {
            System.out.print("gg");
        } else if (endYear - startYear == 1000) {
            if (endMonth > startMonth || (endMonth == startMonth && endDay >= startDay)) {
                System.out.print("gg");
            } else {
                long diff = toDays(endYear, endMonth, endDay) - toDays(startYear, startMonth, startDay);
                System.out.print("D-" + diff);
            }
        } else {
            long diff = toDays(endYear, endMonth, endDay) - toDays(startYear, startMonth, startDay);
            System.out.print("D-" + diff);
        }
    }
    
    private static boolean isLeapYear(int year) {
        if (year % 400 == 0) {
            return true;
        }
        if (year % 100 == 0) {
            return false;
        }
        return year % 4 == 0;
    }
    
    private static int daysInYear(int year) {
        return isLeapYear(year) ? 366 : 365;
    }
    
    private static int daysInMonth(int year, int month) {
        int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if (month == 2 && isLeapYear(year)) {
            return 29;
        }
        return days[month];
    }
    
    private static long toDays(int year, int month, int day) {
        long total = 0;
        for (int y = 1; y < year; y++) {
            total += daysInYear(y);
        }
        
        for (int m = 1; m < month; m++) {
            total += daysInMonth(year, m);
        }
        
        total += day;
        return total;
    }
}

'알고리즘(백준 등) 공부 > 백준(자바)' 카테고리의 다른 글

백준 1311번: 할 일 정하기 1  (0) 2026.03.12
백준 1309번: 동물원  (0) 2026.03.09
백준 1304번: 지역  (0) 2026.03.07
백준 1302번: 베스트셀러  (0) 2026.03.06
백준 1301번: 비즈 공예  (0) 2026.03.04