function getSec(time) {
time = time.split(':');
return time[0] * 3600000 + time[1] * 60000 + time[2] * 1000;
}
function solution(lines) {
lines = lines.map(e => e.split(' '));
let finishTime = lines.map(e => getSec(e[1]));
let startTime = lines.map((e,i) => finishTime[i] - e[2].replace('s','')*1000 + 1);
let points = startTime.concat(finishTime).sort((a,b) => a-b);
let answer = 0;
for(let i = 0; i < points.length; i++) {
let cnt = 0;
for(let j = 0; j < startTime.length; j++) {
if(points[i] <= finishTime[j] && (points[i] + 999) >= startTime[j]) cnt++;
}
if(answer < cnt) answer = cnt;
}
return answer;
}
1초를 나눠주는 구간을 잡는 것이 핵심.
각 처리시간의 시작시간과 완료 시간을 기점으로 1초간 체크하여 그사이에 처리되고있는 자료들의 개수를 구한다.
먼저 시작시간과 완료시간을 구하기 위해 밀리초 단위로 환산한다.
초 단위로 환산할 경우 0.999초를 더해주는 과정에서 정확한 계산이 나오지 않는 경우가 발생한다.
ex) 0 + 0.999 = 0.9988888888886 이 예시가 실제 예시는 아니고 이러한 경우처럼 정확한 계산이 안되는 상황이 있어 테스트 케이스를 실패하게 된다.
시작시간과 완료시간을 배열로 따로 만들어 준 뒤 두 배열을 concat하여 오름차순으로 정렬하면 기점들이 배열에 담기게 된다.
이 기점들을 기준으로 1초간 처리되는 자료의 개수 최대값을 반환한다.