[문제 위치]
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;
}
'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글
[Silver V] 중간고사 채점 - 15702 (0) | 2024.11.03 |
---|---|
[Silver V] 백대열 - 14490 (0) | 2024.10.30 |
[Silver I] Make a Guess - 5679 (1) | 2024.09.28 |
[Silver V] Убийственная математика - 28733 (0) | 2024.09.28 |
[Silver V] 무한 문자열 - 12871 (0) | 2024.09.26 |