https://www.acmicpc.net/problem/1340
날짜랑 시간을 다루는 문제입니다.
문제 분석
현재 월, 일, 년도, 시각(hh:mm) 을 입력 받아서 이번해의 몇 퍼센트가 경과해야 했는지 알아내는 문제입니다.
먼저 분 까지 입력받으므로 다 분으로 환산해서 더하면 간단합니다.
월 마다 일수가 31, 30, 28 으로 다르므로 확인해야 하고
윤년도 고려해야 합니다. 윤년은 2월 29일 / 1년 366일로 계산하도록 주의합니다.
1. 입력받은 년도, 월, 일, 시각을 정수형으로 변환
2. 년도 - 윤년 여부 확인
3. 월, 일 , 시각을 분으로 환산하여 모두 더함
4. 3 에서 구한 총 경과시간(단위: 분) / 1년(단위:분) * 100 으로 퍼센트 계산
년도를 정수로 변환할때는 다음과 같이 구했습니다.
string mon[12] = { "January", "February", "March", "April", "May", "June"
, "July", "August", "September", "October", "November", "December" };
int intMonth;
int intDate;
// 월
for (int i = 0; i < 12; i++)
{
if (m == mon[i])
{
intMonth = i + 1;
}
}
월 별로 일수를 구할때는 int 배열 만들어서 구했습니다.
int md_1[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int md_2[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
// 경과한 총 일수
int m_days = 0;
// 윤년 여부
if (!yn)
{
for (int i = 0; i < intMonth-1; i++)
{
m_days += md_1[i];
}
}
else
{
for (int i = 0; i < intMonth-1; i++)
{
m_days += md_2[i];
}
}
m_days += intDate-1;
소스 코드
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <climits>
#include <algorithm>
using namespace std;
string mon[12] = { "January", "February", "March", "April", "May", "June"
, "July", "August", "September", "October", "November", "December" };
int md_1[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int md_2[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int main()
{
string m;
string d;
int y;
string hhmm;
cin >> m >> d >> y >> hhmm;
int intMonth;
int intDate;
// 월
for (int i = 0; i < 12; i++)
{
if (m == mon[i])
{
intMonth = i + 1;
}
}
string find_str = ",";
string replace_str = "";
// 일
d.replace(d.find(find_str), find_str.length(), replace_str);
intDate = stoi(d);
// 시
string tempt = "";
tempt += hhmm[0];
tempt += hhmm[1];
int intTime = stoi(tempt);
// 분
string tempm = "";
tempm += hhmm[3];
tempm += hhmm[4];
int intMin = stoi(tempm);
// 0. 윤년확인
bool yn;
if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
{
yn = true;
}
else
{
yn = false;
}
// 1. 1년의 전체 분(평년)
int totalm;
if (!yn)
{
totalm = 365 * 24 * 60;
}
else
{
totalm = 366 * 24 * 60;
}
// 경과한 총 일수
int m_days = 0;
if (!yn)
{
for (int i = 0; i < intMonth-1; i++)
{
m_days += md_1[i];
}
}
else
{
for (int i = 0; i < intMonth-1; i++)
{
m_days += md_2[i];
}
}
m_days += intDate-1;
// 분으로 환산
int totalpass = m_days * 24 * 60 + intTime * 60 + intMin;
double res = (double)totalpass / (double)totalm * 100;
cout.precision(15);
cout << res << "\n";
}'백준 > 실버' 카테고리의 다른 글
| [백준 3060]- 욕심쟁이 돼지(c++) (0) | 2026.03.23 |
|---|---|
| [백준 14916] - 거스름돈(c++) (0) | 2026.03.16 |
| [백준 3758] - KCPC(C++) (0) | 2026.02.23 |
| [백준 1991] - 트리 순회(C++) (0) | 2025.12.24 |
| [백준 1158] - 요세푸스 문제(C++) (1) | 2025.12.16 |