티스토리 뷰

문제

문빙이는 새해를 좋아한다. 하지만, 이제 새해는 너무 많이 남았다. 그래도 문빙이는 새해를 기다릴 것이다.

어느 날 문빙이는 잠에서 깨면서 스스로에게 물었다. “잠깐, 새해가 얼마나 남은거지?”

이 문제에 답하기 위해서 문빙이는 간단한 어플리케이션을 만들기로 했다. 연도 진행바라는 것인데, 이번 해가 얼마나 지났는지를 보여주는 것이다.

오늘 날짜가 주어진다. 이번 해가 몇%지났는지 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 Month DD, YYYY HH:MM과 같이 주어진다. Month는 현재 월이고, YYYY는 현재 연도이다. 숫자 네자리이다. DD, HH, MM은 모두 2자리 숫자이고, 현재 일, 시, 분이다.

Month는 January, February, March, April, May, June, July, August, September, October, November, December 중의 하나이고, 연도는 1800보다 크거나 같고, 2600보다 작거나 같다. 항상 올바른 날짜와 시간만 입력으로 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.

 

#include <iostream>
using namespace std;
int main() {
	string month, time, day;
	string eng_mon[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
	int year, mon, dayarr[2] = {}, count = 0, hour, min, totalmin;
	cin >> month >> day >> year >> time;
	
	int m_arr[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {		//연도
		m_arr[1] = 29;
		totalmin = 366 * 24 * 60;
	}
	else
		totalmin = 365 * 24 * 60;

	int daysum = 0;

	for (int i = 0; i < 12; i++) {		//월
		if (month == eng_mon[i]) {
			for (int j = 0; j < i; j++) {
				daysum += m_arr[j];
			}
			break;
		}
	}	

	for (int i = 0; i < day.length() - 1; i++) {		//일
		dayarr[i] = day[i] - '0';
		count++;
	}

	if (count == 1)	
		daysum += dayarr[0];
	else if (count == 2)
		daysum += dayarr[0] * 10 + dayarr[1];
	daysum--;

	if (time[0] == '0') {					//시간
		hour = time[1] - '0';
	}
	else
		hour = (time[0] - '0') * 10 + (time[1] - '0');

	if (time[3] == '0') {					//분
		min = time[4] - '0';
	}
	else
		min = (time[3] - '0') * 10 + (time[4] - '0');

	int minsum = daysum * 24 * 60 + hour * 60 + min;
    
	double result = (double)minsum / totalmin * 100;
	printf("%0.9f\n", result);
}

해결: 1월 1일부터 입력받은 날짜까지의 시간을 분으로 변환(minsum)/ 주어진 연도 전체를 분으로 변환(totalmin) * 100으로 계산

 

주어진 연도가 윤년일 경우 totalmin은 366일*24시간*60분으로 계산해야 함(윤년에는 2월이 29일이므로 365+1)

 

daysum라는 변수에 1월 1일~입력받은 날짜까지의 시간을 먼저 일 수로 변환

(*주의: 만약 May를 입력받았다면 아직 5월이 다 지나간 것이 아니기 때문에 1월부터 4월까지의 일 수를 더해줘야 함.

또한, 10일을 입력받았다면 마찬가지로 아직 10일이 다 지나간 것이 아니기 때문에 1일부터 9일까지의 일 수를 더해줘야 함)

 

1월 1일부터 입력받은 날짜까지의 일 수를 구했으니 이제 분으로 변환(daysum(일 수) * 24시간 * 60분 + hour * 60분 + min)

'백준 > BRONZE' 카테고리의 다른 글

[백준/C++] 2231 분해합  (0) 2021.02.24
[백준/C++] 1919 애너그램 만들기  (0) 2021.02.23
[백준/C++] 1233 주사위  (0) 2021.02.18
[백준/C++] 1193 분수찾기  (0) 2021.02.18
[백준/C++] 1225 이상한 곱셈  (0) 2021.02.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함