https://www.acmicpc.net/problem/25318

 

25318번: solved.ac 2022

첫 번째 경우에서 첫 번째 의견은 마지막 의견에 비해 약 $834$일 $6$시간$\,\approx 2.286$년 전 의견이므로, 가중평균은 \[X\approx\frac{\max\left( 0.5^{2.286},0.9^1 \right)\times 24+\max\left( 0.5^0,0.9^0 \right)\times 18}{\

www.acmicpc.net

맨처음에 문제를 봤을 때 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;
}

 

 

월 계산할때 반복문 범위를 잘못 설정하여 한번 틀렸다.

 

 

 

루오