작성일 :

문제 링크

9428번 - Effective Infection Time

설명

A.Z(After Zombie), 즉 좀비 사태 이후 격리 구역의 EIT(Effective Infection Time)을 계산하는 문제입니다.

문제에서 설명하는 EIT 의 계산 규칙은 다음과 같습니다.

  • 감염 날짜(Infection date) 와 증상 발생 날짜(Strike date) 의 두 가지 요인에 의해 계산
  • 각 월은 해당 월의 마지막 날이 지난 후에만 EIT 의 일부로 계산
  • 감염의 첫 해는 (1 / 2)EIT 로 계산
    • 다만, 아직 해당 연도가 끝나지 않았다면, 각 월은 (1 / 2)EIT 의 일부로만 계산
    • 예시
      • 감염이 첫 해의 1월에 발생하였다면, (1 / 2)EIT 가 12개월 동안 분배되어 (0.0417EIT / 월)
      • 감염이 첫 해의 3월에 발생하였다면, (1 / 2)EIT 가 10개월 동안 분배되어 (0.0500EIT / 월)
  • 연도가 끝났다면, 감염 월에 상관없이 무조건 그 해의 EIT 는 (1 / 2) 가 됨
  • 이후의 모든 해는 1EIT 로 계산되며, 각 달의 EIT 는 (0.0833EIT / 월) 으로 분배 됨

입력으로 감염 날짜와 감염 연도, 증상 발생 날짜와 증상 발생 연도가 주어졌을 때,

위 EIT 계산 규칙에 맞추어 EIT 를 계산하여 출력합니다.


Code

[ C# ]

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
namespace Solution {
  class Program {
    static void Main(string[] args) {

      const int MONTH = 0;
      const int YEAR = 1;

      var n = int.Parse(Console.ReadLine()!);

      for (int i = 0; i < n; i++) {
        var infection = Console.ReadLine()!.Split(' ').Select(int.Parse).ToArray();
        var strike = Console.ReadLine()!.Split(' ').Select(int.Parse).ToArray();

        double eit = 0.0;
        if (infection[YEAR] == strike[YEAR])
          eit += 0.5 * (strike[MONTH] - infection[MONTH]) / (12.0 - infection[MONTH] + 1);
        else
          eit += 0.5 + (strike[YEAR] - infection[YEAR] - 1) + (strike[MONTH] - 1) / 12.0;

        Console.WriteLine($"{eit:F4}");
      }

    }
  }
}



[ C++ ]

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
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;

  for (int i = 0; i < n; i++) {
    int iMonth, iYear, sMonth, sYear;
    cin >> iMonth >> iYear >> sMonth >> sYear;

    double eit = 0.0;
    if (iYear == sYear)
      eit += 0.5 * (sMonth - iMonth) / (12.0 - iMonth + 1);
    else
      eit += 0.5 + (sYear - iYear - 1) + (sMonth - 1) / 12.0;

    cout.setf(ios::fixed); cout.precision(4);
    cout << eit << "\n";
  }

  return 0;
}