import Foundation
func solution(_ lines:[String]) -> Int {
var max = 1 // 처리량 최대값 기록
let tuples = getMilliSec(lines) // 시작시간 끝시간을 밀리세컨드로 변환하여 보관
for (i, iTuple) in tuples.enumerated() {
var throughput = 1 // 처리량
// 체크기간 산정
let checkStartPoint = iTuple.1
let checkEndPoint = iTuple.1 + 1.0 // 1초동안 체크
for (j, jTuple) in tuples.enumerated() {
if i == j { // 자기 자신은 비교안하고 패스
continue
}
if jTuple.0 <= checkStartPoint && checkStartPoint <= jTuple.1 // 체크기간 내에 끝쪽만 닿은 경우
|| jTuple.0 >= checkStartPoint && jTuple.1 < checkEndPoint // 체크기간 내에 쏙 들어간 경우
|| jTuple.0 < checkEndPoint && checkEndPoint <= jTuple.1 // 체크기간 내에 시작쪽만 닿은 경우
|| jTuple.0 <= checkStartPoint && checkEndPoint <= jTuple.1 { // 체크기간을 양쪽다 넘어서는 경우
throughput += 1
}
}
if max < throughput {
max = throughput
}
}
return max
}
// 시작시간 끝시간을 밀리세컨드로 변환
func getMilliSec(_ lines:[String]) -> [(Double, Double)] {
var tuple: [(Double, Double)] = []
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss.SSS"
for line in lines {
let timeStrArr = line.components(separatedBy: " ")
let endSec = formatter.date(from: timeStrArr[1])!.timeIntervalSince1970
var throughputSecStr = timeStrArr[2]
throughputSecStr.removeLast() // 's' 문자 삭제
let startSec = endSec - (Double(throughputSecStr)! - 0.001)
tuple.append((startSec, endSec))
}
return tuple
}
각 시간 끝쪽만 체크하면 된다는게 포인트.
로직을 어떻게 짤지보다 밀리세컨드 변환을 어떻게할지를 더 고민한 듯 하다... (본인은 DateFormatter로 변환했는데 다풀고 남들 코드들 보니 나만빼고 다들 밀리세컨드로 직접 변환...)
레벨3인데 생각보다 쉬웠던 문제