프로그래머스 - 추석 트래픽(Lv. 3)

OQ·2022년 3월 1일
0

프로그래머스

목록 보기
3/33

문제 링크

풀이

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인데 생각보다 쉬웠던 문제

profile
덕업일치 iOS 개발자

0개의 댓글