본문 바로가기

문제 풀이/문제 풀이(BOJ)

[Silver V] D-Day

[문제 위치]

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

[문제 풀이]

제시한대로 코드를 짜기만 하면 되는 문제이다.

#include <iostream>
#include <tuple>
#include <cmath>

#define fastio ios::sync_with_stdio(false); cin.tie(nullptr);
using namespace std;

// 윤년 여부를 체크하는 함수
bool is_leap(int year) {
    if (year % 4 == 0) {
        if (year % 100 == 0) {
            if (year % 400 == 0) {
                return true; // 400으로 나누어지면 윤년
            }
            return false; // 100으로 나누어지면 평년
        }
        return true; // 4로 나누어지면 윤년
    }
    return false;
}

// 각 달의 일수를 반환하는 함수 (윤년 여부에 따라 2월이 달라짐)
int days_in_month(int year, int month) {
    static int month_days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (month == 2 && is_leap(year)) {
        return 29; // 윤년이면 2월은 29일
    }
    return month_days[month - 1]; // 그 외에는 해당 월의 일수 반환
}

// 날짜를 일수로 변환하는 함수 (기준은 1년 1월 1일부터)
int days_from_start(int year, int month, int day) {
    int days = 0;
    // 1년 1월 1일부터 year-1년 12월 31일까지의 일수를 더한다.
    for (int y = 1; y < year; ++y) {
        days += is_leap(y) ? 366 : 365;
    }
    // 해당 연도의 1월부터 month-1월까지의 일수를 더한다.
    for (int m = 1; m < month; ++m) {
        days += days_in_month(year, m);
    }
    // 마지막으로 그 달의 day 일수를 더한다.
    days += day;
    return days;
}

int main() {
    fastio;

    int y1, m1, d1;
    int y2, m2, d2;

    // 오늘 날짜 입력
    cin >> y1 >> m1 >> d1;
    // D-Day 날짜 입력
    cin >> y2 >> m2 >> d2;

    // 두 날짜를 일수로 변환
    int today_days = days_from_start(y1, m1, d1);
    int dday_days = days_from_start(y2, m2, d2);

    // 날짜 차이 계산
    int difference = dday_days - today_days;

    // 1000년 이상 차이나는 경우 "gg" 출력
    if (y2 - y1 > 1000 || (y2 - y1 == 1000 && make_tuple(m2, d2) >= make_tuple(m1, d1))) {
        cout << "gg\n";
    } else {
        // 그 외에는 "D-"와 함께 차이 출력
        cout << "D-" << difference << "\n";
    }

    return 0;
}