https://www.acmicpc.net/problem/25318
맨처음에 문제를 봤을 때 C++로 "/"와 ":"를 어떻게 나눌까 고민이 많았다. 파이썬에서는 그냥 split을 사용하면 편하게 다룰수 있었는데 확실히 C++은 문자열 다루는 것이 좀더 어렵다.
seperator로 분리해서 볼까도 했는데 굳이 그러지 않고 /와 : 를 포함한 문자열 전체를 그냥 입력받아 인덱싱을 통해서 문제를 해결하였다. 문자열의 길이가 일정하기 때문에 굳이 분리하지 않고도 한번에 규칙적으로 시간을 day로 바꿀 수 있다.
그리고 구조체를 사용하였는데 이 생각을 바로 떠올리지 못해서 많이 애먹었다. 아무래도 파이썬에서는 구조체를 사용하지 않다보니 그런듯 하다.
(구조체를 사용하지 않을 수도 있겠지만 그렇게 하면 코드 너무 길어지고 메모리도 많이 낭비하였을 것이다.)
입력받은 년/월/일 을 모두 일로 바꾸었고 년도가 20년도 보다 높으면 윤년을 생각하여 day++를 해주었다.
시간도 모두 day로 바꾸어서 년/월/일에서 구한 day에 더해주었다.
코드는 다음과 같다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <stack>
#include <deque>
#include <set>
#include <sstream>
#include <cmath>
#define endl "\n"
using namespace std;
struct TIME {
string s1;
string s2;
double l;
};
TIME tmp[1001];
double Convert(string s1, string s2);
int mon_list[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
ios::sync_with_stdio(0); cin.tie(0);
int n;
double p;
cin >> n;
if(n == 0){
cout << 0;
return 0;
}
for(int i = 1; i < n+1; i++){
cin >> tmp[i].s1 >> tmp[i].s2 >> tmp[i].l;
}
double tn = Convert(tmp[n].s1,tmp[n].s2);
double up = 0, down = 0;
for(int i = 1; i < n+1; i++){
double ti = Convert(tmp[i].s1,tmp[i].s2);
p = max(pow(0.5,(tn-ti)/365), pow(0.9,n-i));
up += p * tmp[i].l;
down += p;
}
double X = round(up/down);
cout << X;
}
double Convert(string s1, string s2){
double year = (s1[2] - '0') * 10 + (s1[3] - '0');
double month = (s1[5] - '0') * 10 + (s1[6] - '0');
double day = (s1[8] - '0') * 10 + (s1[9] - '0');
day += year * 365;
if (int(year) > 20) day++;
for(int i = 1; i <= month-1; i++){
if(i == 2 && int(year) == 20) day++;
day += mon_list[i];
}
double hour = (s2[0] - '0') * 10 + (s2[1] - '0');
double min = (s2[3] - '0') * 10 + (s2[4] - '0');
double second = (s2[6] - '0') * 10 + (s2[7] - '0');
double total = hour / 24 + min / (60*24) + second / (3600*24);
day += total;
return day;
}
월 계산할때 반복문 범위를 잘못 설정하여 한번 틀렸다.
'📚알고리즘 > 백준' 카테고리의 다른 글
[백준 27172번] 수 나누기 게임 (C++) (1) | 2023.10.17 |
---|---|
[백준 2166번] 다각형의 면적 (C++) (0) | 2023.10.17 |
[백준 9465번] 스티커 (C++) (0) | 2023.05.31 |
[백준 1629번] 곱셈 (Python/파이썬) (0) | 2023.05.28 |
[백준 12970번] AB (Python/파이썬) (0) | 2023.05.27 |