[プログラマー][第1ラウンド]中秋流量解答(Python)


質問の表示

に答える


問題は、リストが完了順に並べられ、スループットの最大値が1秒以内に求められることです.
リクエストが完了した時間(リクエストを含む)から、1秒以内の処理中のリクエスト数を計算し、最大値を見つけ、返される方法で解きます.
要求は「2016-09-1501:00:04.001 2.0 s」の日付、要求完了時間、処理に要する時間の順に空白に分割され、文字列形式で与えられる.
時間を比較するために要求データを加工する必要があるため、各要求完了後1秒、要求完了時間から処理に要する時間を減算する要求開始時間を求める関数が必要となる.
要求完了順に並べ替えられたリストについては、基準となる要求完了時間から1秒後までの時間であり、これらの後要素の要求開始時間が要求開始時間よりも小さい(高速)要求は、1秒以内に要求処理が含まれているとみなされ、カウントされ、最後に1秒以内に処理される最大要求の数が計算され、戻される.

コード#コード#

def start_time(log, t):
    hh, mm , ss = log
    ss = round(float(ss) - float(t) + 0.001, 3)
    if ss < 0:
        mm = int(mm)-1
        ss += 60
        if mm < 0:
            hh = int(hh)-1
            mm = mm + 60
            if hh < 0:
                return [0, 0, 0]
    return [int(hh),int(mm),ss]


def after_1sec(log):
    hh, mm , ss = log
    ss = round(float(ss) + 0.999, 3)
    if ss >= 60:
        ss = round(ss - 60, 3)
        mm = int(mm) + 1
        if mm >= 60:
            mm -= 60
            hh = int(hh) + 1
            if hh >= 60:
                return [23, 59, 59.999]
    return [int(hh),int(mm),ss]

def is_contain(end, start):
    if end[0] < start[0]: return False
    if end[1] < start[1]: return False
    if end[2] < start[2]: return False
    return True
    
def solution(lines):
    answer = 1
    lines = list(map(lambda x: [x.split()[1].split(':'), x.split()[2][:-1]], lines))
    for i in range(len(lines)-1):
        cnt = 1
        for j in range(i+1, len(lines)):
            if is_contain(after_1min(lines[i][0]), start_time(lines[j][0], lines[j][1])):
                cnt += 1
        answer = max(answer, cnt)
    return answer