[Swift/Python]プログラマー(Lv 3)-[第1ラウンド]中秋流量(2018 KAO BLIND RECRUITMENT)


こんにちは:
https://programmers.co.kr/learn/courses/30/lessons/17676



に答える


まず、0.001 s(ミリ秒レベル、msec)を1に変換します.
数秒を求めて、それから1000を乗じて、msecになりました.
로그 문자열 2016-09-15 03:10:33.020 0.011s은 
"2016년 9월 15일 오전 3시 10분 33.010초"부터 
"2016년 9월 15일 오전 3시 10분 33.020초"까지 
"0.011초" 동안 처리된 요청을 의미한다.
  • 問題において上記説明が行われているため、要求開始の時間startの前に時間と分が省略されている.33020msec - 11msec + 1msec = 33010msecです.
  • このようにstart配列を作るにはend配列を作成する必要があります.
    endはリクエストのタイムアウトmsec+1000 msec(1秒)である.
    さらに1秒多くする理由は、33.010秒でリクエストが完了すると34.010より前の1秒以内に対応するリクエストがあるからです.
  • (スループット/秒)
  • start配列を昇順に並べます.(endは問題において既に昇順に並べられており、1000 msecを加えてそのまま使用されている)
  • startがendより小さい場合、流量は
  • デュアルポインタ(startIdx,endIdx)を使用して1増加する.
    startがend以上の場合、それは含まれません.したがって、トラフィックが減少し、endIdxが増加します.
  • これはSWIFTコードです.SWIFTで解くときにFloatを使うと誤差があります
    Doubleを使うと答えが出てくるのかな….もっと正確にするにはDecimalを使う必要があります
    import Foundation
    
    func solution(_ lines:[String]) -> Int {
        var starts = [Int]()
        var ends = [Int]()
        
        for line in lines {
            let time = line.components(separatedBy: [" ", ":", "s"])
            let msec = (Int(time[1])! * 3600 + Int(time[2])! * 60) * 1000 + Int(Double(time[3])! * 1000)
            let start = msec - Int(Double(time[4])! * 1000) + 1
            let end = msec + 1000
            starts.append(start)
            ends.append(end)
        }
        
        starts.sort()
        var startIdx = 0
        var endIdx = 0
        var traffic = 0
        var maxTraffic = 0
        let n = lines.count
        
        while startIdx < n && endIdx < n {
            if starts[startIdx] < ends[endIdx] {
                traffic += 1
                maxTraffic = max(traffic, maxTraffic)
                startIdx += 1
            } else {
                traffic -= 1
                endIdx += 1
            }
        }
        
        return maxTraffic
    }
    Pythonコード.
    def solution(lines):
        starts = []
        ends = []
    
        for line in lines:
            line = line.split()
            time = line[1].split(':')
            msec = int((int(time[0]) * 3600 + int(time[1]) * 60 + float(time[2])) * 1000)
            start = msec - int(float(line[2][:-1]) * 1000) + 1
            end = msec + 1000
            starts.append(start)
            ends.append(end)
        
        starts.sort()
        traffic = 0
        max_traffic = 0
        start_idx = 0
        end_idx = 0
        n = len(lines)
        
        while start_idx < n and end_idx < n:
            if starts[start_idx] < ends[end_idx]:
                traffic += 1
                max_traffic = max(traffic, max_traffic)
                start_idx += 1
            else:
                traffic -= 1
                end_idx += 1
            
        return max_traffic