Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

hwooo

BOJ (C/C++) 1308번: D-Day 본문

Study/Algorithm

BOJ (C/C++) 1308번: D-Day

hwooo 2022. 11. 26. 17:37

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

 

1308번: D-Day

첫째 줄에 오늘의 날짜가 주어지고, 두 번째 줄에 D-Day인 날의 날짜가 주어진다. 날짜는 연도, 월, 일순으로 주어지며, 공백으로 구분한다. 입력 범위는 1년 1월 1일부터 9999년 12월 31일 까지 이다.

www.acmicpc.net


풀이

의외로 윤년 조건이 은근 까다로웠다. 년도가 같을 때, 달이 같을 때를 나눠서 짰다

문제 풀 때 넣어봤던 반례들은 아래에서 확인 가능하다

 

 
반례
더보기
반례

// 윤년 조건
2000 1 1
2001 1 1
D-366

2004 1 1
2005 1 1
D-366

1000 1 1
1001 1 1
D-365

2100 1 1
2101 1 1
D-365

// 연도 같을 때
2000 1 1
2000 1 2
D-1

2000 1 1
2000 2 1
D-31

2000 1 31
2000 2 2
D-2

// 연도 다를 때
2000 1 2
2001 1 25
D-389

2000 1 2
2001 2 5
D-400

2000 2 5
2002 8 1
D-908

2000 1 25
2001 2 1
D-373

코드

#include <stdio.h>
bool Is_leap(int Y) {
	if ((Y % 4 == 0 && Y % 100 != 0) || Y % 400 == 0) return true;
	return false;
}
void D_Day(int y1, int y2, int m1, int m2, int d1, int d2) {
	int month[13] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
	int day = 0;

	for (int y = y1 + 1; y < y2; y++) {
		day += 365;
		if (Is_leap(y)) day++;
	}

	if (y1 != y2) {
		for (int m = m1 + 1; m <= 12; m++) {
			day += month[m];
			if (m == 2 && Is_leap(y1)) day += 1;
		}
		for (int m = 1; m < m2; m++) {
			day += month[m];
			if (m == 2 && Is_leap(y2)) day += 1;
		}
		day += (month[m1] - d1);
		if (m1 == 2 && Is_leap(y1)) day += 1;
		day += d2;
	}
	else {
		if (m1 != m2) {
			for (int m = m1 + 1; m < m2; m++) {
				day += month[m];
				if (m == 2 && Is_leap(y1)) day += 1;
			}
			day += (month[m1] - d1);
			if (m1 == 2 && Is_leap(y1)) day += 1;
			day += d2;
		}
		else day += (d2 - d1);
	}
	printf("D-%d", day);
}
int main() {
	int y1, y2, m1, m2, d1, d2;
	scanf("%d %d %d", &y1, &m1, &d1);
	scanf("%d %d %d", &y2, &m2, &d2);

	if (y2 - y1 > 1000) printf("gg");
	else if (y2 - y1 == 1000) {
		if (m2 >= m1 && d2 >= d1) printf("gg");
		else D_Day(y1, y2, m1, m2, d1, d2);
	}
	else D_Day(y1, y2, m1, m2, d1, d2);
	return 0;
}