[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になりました.問題において上記説明が行われているため、要求開始の時間startの前に時間と分が省略されている. このように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を使う必要があります
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초" 동안 처리된 요청을 의미한다.
33020msec - 11msec + 1msec = 33010msec
です.endはリクエストのタイムアウトmsec+1000 msec(1秒)である.
さらに1秒多くする理由は、33.010秒でリクエストが完了すると34.010より前の1秒以内に対応するリクエストがあるからです.
startがend以上の場合、それは含まれません.したがって、トラフィックが減少し、endIdxが増加します.
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
Reference
この問題について([Swift/Python]プログラマー(Lv 3)-[第1ラウンド]中秋流量(2018 KAO BLIND RECRUITMENT)), 我々は、より多くの情報をここで見つけました https://velog.io/@kerri/Python-프로그래머스Lv3-1차-추석-트래픽-2018-KAKAO-BLIND-RECRUITMENTテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol