[プログラマー/JavaScript]秋夕トラフィック

11633 ワード

問題の説明📝


今年の秋夕(チュソク、陰暦8月15日)にシステム障害のない祝日を過ごすために、Apacheはサーバーの増設を悩んでいる.障害対応サーバーを増設するかどうかを決めるため、昨年秋夕(チュソク、陰暦8月15日)、9月15日にログデータを分析した後、1秒当たりの最大スループットを算出することにした.1秒あたりの最大スループットは、要求が応答を完了するかどうかにかかわらず、任意の時間から1秒(=1000ミリ秒)の要求を処理する最大数を意味します.

入力フォーマット


2479172ソリューション関数に送信される行シーケンスは、要求に対する各ログ文字列の応答完了時間Sおよび処理時間Tがスペースで区切られたN(1≦N≦2000)個のログ文字列からなる.
  • 回答完了時間Sは昨年秋夕の2016年9月15日のみで、固定長2016-09-15 hhhh:mm:ss.sss形式で存在する.
  • 処理時間Tは、0.1 s、0.312 s、2 sと同様に最大小数点の3番目に記録され、後に秒単位を示すsが続く.
  • 例えば
  • 、ログ文字列2016-09-1503:10:33.00 0.011 sは、「2016年9月15日午前3時10分33.010秒」から「2016年9月15日午前3時10分33.00秒」までの間に処理される要求を意味する.(処理時間は開始時間と終了時間を含む)
  • .
    24172サーバ上のタイムアウト時間は3秒であるため、処理時間は0.001≦T≦3.000である.
  • 行配列は、応答完了時間Sを基準とした昇順配列である.
  • 出力フォーマット

  • ソリューション関数は、ログ・データ・ライン・アレイに対して毎秒最大スループットを返します.
  • に答える


    異なる区間を用いたGriddy問題の答えは似ている.
  • 所与の時間を秒
  • に変換する.
  • 流量の開始時間に基づいて
  • をソートする.
  • すべての流量の開始時間と終了時間に基づいて、1秒以内に
  • を比較する.
    function solution(lines) {
      let answer = 0;
    
      const getSecond = (time) => {
        const splitedTime = time.split(":");
        const hour = Number(splitedTime[0] * 3600);
        const minute = Number(splitedTime[1] * 60);
        const second = Number(splitedTime[2]);
    
        return hour + minute + second;
      };
    
      const traffic = lines
        .map((line) => [
          Number(
            (
              getSecond(line.split(" ")[1]) -
              line.split(" ")[2].slice(0, -1) +
              0.001
            ).toFixed(3)
          ),
          getSecond(line.split(" ")[1]),
        ])
        .sort((a, b) => a[0] - b[0]);
    
      const point = [];
      traffic.forEach(([start, end]) => {
        point.push(start), point.push(end);
      });
      point.sort();
    
      point.forEach((startPoint) => {
        let start = startPoint;
        let end = startPoint + 1;
        let count = 0;
    
        traffic.forEach(([startTraffic, endTraffic]) => {
          if (
            (start <= startTraffic && startTraffic < end) ||
            (start <= endTraffic && endTraffic < end) ||
            (start >= startTraffic && endTraffic > end)
          ) {
            count += 1;
          }
        });
    
        if (count > answer) answer = count;
      });
    
      return answer;
    }