안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.3) - [1차] 추석 트래픽" 문제를 풀었습니다.
Github
문제 링크
풀이
이번 문제는 참 헷갈린 문제였습니다.
0. 문제 이해
특히 "처리시간은 시작시간과 끝시간을 포함"한다는 부분이 이해가 안 갔는데요.
여러 번 곱씹다 보니 이해가 갔습니다.
0을 포함하여 5개면 0, 1, 2, 3, 4이고 0을 포함하지 않고 5개면 1, 2, 3, 4, 5입니다.
즉, 시작 시간과 끝 시간을 포함한다고 하니 최소 단위 시간(0.001s) 만큼은 빼줘야 한다는 것이죠.
따라서 1초를 더하는 것이 아닌 1s - 0.001s = 0.999s를 더해야 합니다.
1. 시간을 초 단위로 변환하기 (Double)
먼저 해야하는 작업은 문자열로 들어오는 시간을 초 단위로 변환하는 것입니다.
초로 변환하는 이유는 범위 값이 초 단위로 나뉘기 때문입니다.
func stringToSecond(_ time: String) -> Double {
let time = Array(time)
let h = Double(String(time[0...1]))!
let m = Double(String(time[3...4]))!
let s = Double(String(time[6...11]))!
return s + m * 60 + h * 3600
}
만약 Double로 해서 소숫점때문에 통과가 안 된다면 ms로 나눠 Int로 처리하려고 했습니다.
통과가 되서 다행입니다만 안전하게 한다면 ms로 나누는 게 좋을 거 같긴 합니다.
2. 초당 최대 처리량 구하기
이제 초당 최대 처리량을 구해야 합니다.
이는 1초 구간 내에 몇 개의 프로세스가 겹치는지와 동일한 의미입니다.
문제의 input은 완료 시간을 기준으로 오름차순 정렬되어 있습니다.
이는 다음 스케줄은 무조건 현재 스케줄보다 늦게 끝난다는 것을 보장합니다.
따라서 다음 스케줄의 시작 시간이 현재 스케줄의 완료 시간 + 0.999초보다 빠르다면 겹치게 됩니다.
이 겹치는 개수 + 자기자신의 개수가 1초동안 처리되는 개수입니다.
이 개수의 max 값이 답입니다.
후기
제가 푼 방법은 한 번 생각을 더 해야 하는, 제가 생각해도 약간은 이해가 어려운 방법인 것 같습니다.
다른 분의 풀이 중 범위를 하나하나 조건 거는 방법이 있었는데 그 풀이가 더 직관적이고 좋아보였습니다.
항상 직관적인 풀이를 하려고 노력하는데 이 문제 풀이는 왜 꼬아서만 생각이 나는지...
코테 준비를 하다보니 마음이 꼬여서 그런걸까요?
그리고 문제를 풀수록 내 독해력이 부족한가? 의문이 들기 시작하네요.
여러 의미로 속상하게 되었습니다.
감사합니다!
전체 코드
import Foundation
func stringToSecond(_ time: String) -> Double {
let time = Array(time)
let h = Double(String(time[0...1]))!
let m = Double(String(time[3...4]))!
let s = Double(String(time[6...11]))!
return s + m * 60 + h * 3600
}
func solution(_ lines:[String]) -> Int {
var times: [(s: Double, e: Double)] = []
lines.forEach { line in
let ln = line.split { $0 == " " }.map { String($0) }
let endTime = stringToSecond(ln[1])
let completeTime = Double(String(ln[2].dropLast()))!
let startTime = endTime - completeTime
times.append((startTime, endTime))
}
var result = 0
for i in 0..<times.count {
let count = (times[(i+1)...]).filter { times[i].e + 0.999 > $0.s }.count
result = max(result, count + 1) //자기 자신 추가
}
return result
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.