사고쳤어요
[백준] 1340 연도진행바(C++) 본문
링크: https://www.acmicpc.net/problem/1340
1340번: 연도 진행바
평년일 때, 각 달은 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31일이 있다. 윤년에는 2월이 29일이다. 윤년은 그 해가 400으로 나누어 떨어지는 해 이거나, 4로 나누어 떨어지면서, 100으로 나누어 떨어지지
www.acmicpc.net
문제
문빙이는 새해를 좋아한다. 하지만, 이제 새해는 너무 많이 남았다. 그래도 문빙이는 새해를 기다릴 것이다.
어느 날 문빙이는 잠에서 깨면서 스스로에게 물었다. “잠깐, 새해가 얼마나 남은거지?”
이 문제에 답하기 위해서 문빙이는 간단한 어플리케이션을 만들기로 했다. 연도 진행바라는 것인데, 이번 해가 얼마나 지났는지를 보여주는 것이다.
오늘 날짜가 주어진다. 이번 해가 몇%지났는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 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보다 작거나 같다. 항상 올바른 날짜와 시간만 입력으로 주어진다.
풀이
"주어진 시각의 전체 분 / 주어진 연도의 전체 분" 으로 쉽게 구할 수 있다. 윤년 고려만 잘 하면 된다.
코드
#include <iostream>
#include <string>
using namespace std;
// 윤년 계산(400으로 나누어 떨어지거나 4로 나누어 떨어지면서 100으로 나누어 떨어지지 않는 해)
bool isLeafYear(int y){
if (y % 4 == 0){
if (y % 100 == 0){
if (y % 400 == 0){
return true;
}
return false;
}
return true;
}
return false;
}
int main(){
string months[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int daysOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string M, DD, YYYY, HHMM;
int day, year, hour, minute;
cin >> M >> DD >> YYYY >> HHMM;
// string으로 입력받은 값들에서 필요한 부분만 취해 int로 저장
day = stoi(DD.substr(0,2));
year = stoi(YYYY);
hour = stoi(HHMM.substr(0,2));
minute = stoi(HHMM.substr(3,5));
// 해당 연도의 전체 분 계산
double totalMinutes = 365 * 24 * 60;
if (isLeafYear(year)){
totalMinutes += 24 * 60;
}
// 현재 시각의 전체 일수 계산
double accumulateDays = day;
for(int i = 0; i < 12; i++){
if (M == months[i]){
break;
}
accumulateDays += daysOfMonth[i];
if (i == 1 && isLeafYear(year)){
accumulateDays += 1;
}
}
// 해당 시각의 전체 분 계산
double accumulateMinutes = hour * 60 + minute;
accumulateMinutes += (accumulateDays-1) * 24 * 60;
double progressYear = accumulateMinutes / totalMinutes * 100;
// cout 소수점 출력 설정
cout.precision(17);
cout << progressYear;
}
'백준 > Silver' 카테고리의 다른 글
[백준] 1012 유기농 배추(C++) (0) | 2023.03.08 |
---|---|
[백준] 1402 아무래도이문제는A번난이도인것같다(C++) (0) | 2023.02.10 |
[백준] 1343 폴리오미노(C++) (0) | 2023.02.10 |
[백준] 1331 나이트 투어 (C++) (0) | 2023.01.19 |
[백준] 1064 평행사변형 (C++) (0) | 2023.01.18 |