hwooo
BOJ (C/C++) 1308번: D-Day 본문
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
// 윤년 조건
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;
}
'Study > Algorithm' 카테고리의 다른 글
| BOJ (C/C++) 1233번: 주사위 (0) | 2022.11.30 |
|---|---|
| BOJ (C/C++) 1075번: 나누기 (0) | 2022.11.30 |
| BOJ (C/C++) 1022번: 소용돌이 예쁘게 출력하기 (0) | 2022.11.26 |
| BOJ (C/C++) 2028번: 자기복제수 (0) | 2022.11.25 |
| BOJ (C/C++) 14494번: 다이나믹이 뭐예요? (0) | 2022.11.25 |