iOS 개발 기록

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

코딩테스트

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

택꽁이 2022. 4. 12. 17:53
728x90


처음에 문제를 읽고 바로 파악하기 쉽지 않았고, 출력 예제를 보고나서야 어떤 문제인지 파악할 수 있었다. 

주어지는 응답완료시간과 처리시간을 가지고 시작 시간을 구해야 한다. 

 

 

 

 

주어지는 로그의 배열이 응답 완료 시간을 기준으로 정렬되어 있기 때문에 해당 로그의 시작 시간이 전의 로그의 끝나는 시간보다 빠르다면  작업 처리 요청이 무조건 겹친다고 볼 수 있다.
 
예를 들어 S4의 경우 S3보다 끝나는 시간이 늦지만 시작 시간이 (end + 1s) 이내이기 때문에 겹친다고 볼 수 있지만 S3는 시작 시간이 (end+1s) 보다 늦기 때문에 포함시킬 수 없다. 

 

 

import Foundation

func solution(_ lines:[String]) -> Int {
    
    if lines.count == 1 {
        return 1
    }
    
    return trafficNum(lines)
}


// 작업의 시작 시간을 반환
func getStartTime(_ Time : String ) -> Date {
    
    let timeAry = Time.components(separatedBy: " ")
    var intervaltime = Double(timeAry[2].split(separator: "s").first!)
    
    let endTime = getEndTime(Time)
    let startTime = endTime.addingTimeInterval(-(intervaltime)! + 0.001)

    return startTime
}


// 작업의 끝나는 시간을 반환
func getEndTime(_ sen : String) -> Date {
    let endTime = sen.components(separatedBy: " ")[1]
    
    let format = DateFormatter()
    format.dateFormat = "HH:mm:ss.SSS"
    
    guard let endT = format.date(from: endTime) else { return Date() }
    
    return endT
    
}


// 해당 시간에 실행되는 작업 수
func trafficNum(_ lines: [String])  -> Int {
    var result = 0
    var startTimeAry = [Date]()
    var endTimeAry = [Date]()
    
    // 시작시간과 끝나는 시간을 배열로 정렬
    for line in lines {
        startTimeAry.append(getStartTime(line))
        endTimeAry.append(Date(timeInterval: 1, since: getEndTime(line)))
    }
    
    for i in 0..<lines.count-1 {
        var count = 1

        for j in i+1...lines.count-1 {
            // 소수점 3째 자리 반올림
            let sub = round( endTimeAry[i].timeIntervalSince(startTimeAry[j]) * 1000) / 1000
            if sub > 0 {
                count += 1
            }
        }
        result = count > result ? count : result
    }

    return result
}

 

 

 

 

처음에는 trafficNum 함수에서 count를 추가하는 조건을 다음과 같이 했었다.

그런데 테스트 할 때에 ["2016-09-15 01:00:04.001 2.0s", "2016-09-15 01:00:07.000 2s"] 케이스에서 계속 틀렸다.

 Date 의 표기값은 같은데 실제 값이 소수점 8번째 부터 차이가 나서 timeIntervalSince로 계산할 떄에 0 보다 크게 잡혔다. 

 

  for i in 0..<lines.count-1 {
        var count = 1

        for j in i+1...lines.count-1 {
            if  endTimeAry[i].timeIntervalSince(startTimeAry[j]) > 0 {
                count += 1
            }
        }
        result = count > result ? count : result
    }

 

 소수점 3번째자리만 계산하도록 반올림 해서 문제 해결!