해결방법
먼저 monthDay 배열을 보면, 각 월의 날수를 배열로 저장했음을 알 수 있다.
나중에 map을 통해 월을 입력받으면 그 월을 숫자로 변환하여 monthDay의 숫자를 사용하는 방식으로 활용한다.
YearPassed 함수는 윤년을 확인하는 함수로, 연도를 4로 나눠서 0이거나 100으로 나눠서 0은 아닌데 400으로는 0이 된다면 윤년이 되는 방식이다.
monthLeft 함수는 입력된 월 이전까지의 누적일수를 구하는 함수이다. 예를 들어 May가 입력되었다면 4월까지의 일수를 구하게 된다. 여기에 만약 윤년인 경우 1일을 추가하는 방식으로 계산한다.
나머지 입력을 받는 부분과 진행도를 계산하는 것은 매우 간단하니 넘어가도록 하겠다.
정답 코드
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
using namespace std;
int monthDay[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
bool yearPassed(int year)
{
if (year % 4 == 0)
{
if (year % 100 == 0 && year % 400 != 0)
return false;
return true;
}
return false;
}
int monthLeft(int month, int year)
{
int days = 0;
for (int i = 0; i < month - 1; ++i)
{
days += monthDay[i];
}
if (month > 2 && yearPassed(year))
{
days += 1;
}
return days;
}
int main()
{
map<string, int> monthNumber =
{
{"January", 1}, {"February", 2}, {"March", 3},
{"April", 4}, {"May", 5}, {"June", 6},
{"July", 7}, {"August", 8}, {"September", 9},
{"October", 10}, {"November", 11}, {"December", 12}
};
string monthName;
int DD, YY, HH, MM;
char comma, colon;
cin >> monthName >> DD >> comma >> YY >> HH >> colon >> MM;
int month = monthNumber[monthName];
int totalDay = 365 + (yearPassed(YY) ? 1 : 0);
long long totalSec = totalDay * 24 * 60 * 60;
int now = monthLeft(month, YY) + (DD - 1);
long long secs = now * 24 * 60 * 60;
secs += HH * 60 * 60;
secs += MM * 60;
double progress = (double)secs / totalSec * 100;
cout << fixed << setprecision(15) << progress << endl;
return 0;
}
'코딩테스트' 카테고리의 다른 글
BOJ - 자작나무가 없소~ 31496 (1) | 2024.11.29 |
---|---|
BOJ - 행렬 곱셈 2740 (0) | 2024.11.25 |
BOJ - 나무 조각 2947 (0) | 2024.11.22 |
BOJ - TV 크기 1297 (0) | 2024.11.21 |
BOJ - 종이접기 16504 (0) | 2024.11.21 |