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

+ Recent posts