문제링크
https://www.acmicpc.net/problem/1308
문제
캠프에 오게 된 송유진은 캠프가 너무 지루해서 오늘로부터 캠프가 끝날 때 까지 며칠이나 남았는지 알아보고 싶었다. 그런데 캠프는 비상식적으로 길지도 몰라서 (윤년을 포함할지도 모른다) 손으로 하나하나 세기에는 힘들어 보였다.
더욱 정확한 계산을 위해, 유진이는 윤년이 정해지는 기준을 찾아보았고, 그것은 다음과 같았다.
- 서력기원 연수가 4로 나누어떨어지는 해는 우선 윤년으로 한다. (2004년, 2008년, …)
- 100으로 나누어떨어지는 해는 평년으로 한다. (2100년, 2200년, …)
- 400으로 나누어떨어지는 해는 다시 윤년으로 한다. (1600년, 2000년, …)
그런데 캠프가 너무 길 경우, 사춘기인 유진이는 캠프에 무단으로 빠질지도 모른다.
입력
첫째 줄에 오늘의 날짜가 주어지고, 두 번째 줄에 D-Day인 날의 날짜가 주어진다. 날짜는 연도, 월, 일순으로 주어지며, 공백으로 구분한다. 입력 범위는 1년 1월 1일부터 9999년 12월 31일 까지 이다. 오늘의 날짜는 항상 D-Day보다 앞에 있다.
출력
오늘부터 D-Day까지 x일이 남았다면, "D-"를 출력하고 그 뒤에 공백 없이 x를 출력한다. 만약 캠프가 천년 이상 지속된다면 (오늘이 y년 m월 d일이고, D-Day가 y+1000년 m월 d일과 같거나 늦다면) 대신 "gg"를 출력한다. 오늘이 2월 29일인 경우는 주어지지 않는다.
해석
첫 날부터 입력받은 날짜까지 모두 일로 변환해주어 계산해주도록 한다.
코드
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#include <iostream>
using namespace std;
bool leap_year(int year) {
if (year % 4 !=0) {
return false;
}
if (year % 100 != 0) {
return true;
}
if (year % 400 == 0) {
return true;
}
return false;
}
int months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int days(int year, int month, int day) {
int res = 0;
for (int i = 1; i < year; i++) {
res = res + 365 + leap_year(i);
}
for (int i = 0; i < month - 1; i++) {
if (i == 1) {
if (leap_year(year) == true) {
res = res + 29;
}
else {
res = res + 28;
}
}
else {
res = res + months[i];
}
}
res = res + day;
return res;
}
int main() {
int start[3];
int end[3];
for (int i = 0; i < 3; i++) {
cin >> start[i];
}
for (int i = 0; i < 3; i++) {
cin >> end[i];
}
if (end[0] - start[0] >= 1000 && end[1] >= start[1] && end[2] >= start[2]) {
cout << "gg";
return 0;
}
cout << "D-";
cout << days(end[0], end[1], end[2]) - days(start[0], start[1], start[2]);
}
|
cs |
Memo
이것도 꽤나 고전했던 문제다. 브론즈I 단계인데 생각보다 고전하는 문제가 많다. 쉬운 문제도 더러 있긴 하지만..
해결 방법을 고민하는 내공을 쌓아서 승급해보도록 하자.
조급해하지 말기.