정화 코딩

[C++] D-Day (백준 1308번) 본문

PS

[C++] D-Day (백준 1308번)

jungh150c 2025. 1. 8. 14:24

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

 

#include <iostream>
using namespace std;

bool isleap(int n) {
    if (n % 4 == 0) {
        if (n % 100 == 0) {
            if (n % 400 == 0) return true;
            else return false;
        }
        return true;
    }
    return false;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

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

    int y3 = y2 - y1;

    if ((y3 > 1000) || (y3 == 1000 && m2 >= m1 && d2 >= d1)) {
        cout << "gg\n";
    } else {
        int ans = 0;

        if (y3 == 0) {
            while (m1 < m2) {
                if (m1 == 2 && isleap(y1)) ans += 29;
                else ans += month[m1];
                m1++;
            }
            ans += (d2 - d1);
        } else {
            while (m1 < 12) {
                if (m1 == 2 && isleap(y1)) ans += 29;
                else ans += month[m1];
                m1++;
            }

            ans += (month[m1] - d1 + 1);
            y1++;
            m1 = 1;
            d1 = 1;

            while (y1 < y2) {
                if (isleap(y1)) ans += 366;
                else ans += 365;
                y1++;
            }

            while (m1 < m2) {
                if (m1 == 2 && isleap(y1)) ans += 29;
                else ans += month[m1];
                m1++;
            }
            ans += (d2 - d1);
        }

        cout << "D-" << ans << '\n';
    }
}

좀 비효율적으로 짜긴 했는데;;

이 문제에서 헷갈릴만한 건, 천년 이상이라는 게 연도의 차이는 1000 이상이면서 달도 크거나 같고 일도 크거나 같아야 한다는 것이다. 즉, <2000년 1월 1일, 3000년 1월 1일>은 gg가 맞지만, <2000년 1월 2일, 3000년 1월 1일>은 gg가 아니라 계산을 해주어야 한다는 뜻이다. (AC)

 

Comments