문제
풀이
우선 들어오는 입력은 "2016-09-15 01:00:04.001 2.0s"
의 날짜, 작업 종료 시각, 작업 시간 형태로 들어온다
모든 입력이 2016-09-15까지 동일하기 때문에 날짜는 신경쓸 필요가 없다고 생각했고 작업 종료 시각은 시 분 초로 관리하는 것 보다는
단위를 초 로 통일한 뒤 작업 시간을 빼버려서 작업 시작 시각, 작업 종료 시각의 배열을 만든다
구한 배열의 각각의 시작 시각을 기준으로 1초, 종료 시각을 기준으로 1초 사이의 작업 수를 구해서 가장 많은 구간을 얻으면 정답이다
코드
function changeSec(time) {
const arr = time.split(':');
return (1*arr[0]*3600) + (1*arr[1]*60) + (1*arr[2]);
}
function makeGraph(arr) {
const graph = [];
for(let i=0; i<arr.length; i++){
const endTime = changeSec(arr[i][1]);
const startTime = Number(((endTime+0.001) - parseFloat(arr[i][2])).toFixed(3));
graph.push({start: startTime, end : endTime});
}
return graph;
}
function interval(arr, idx) {
const startToSec = arr[idx].start;
const endToSec = arr[idx].end;
console.group(`${idx}번 째 시작 ${startToSec} 에서부터 1초간`);
const start = searchSec(startToSec);
console.log(`${start}개 프로세스`);
console.groupEnd();
console.group(`${idx}번 째 끝 ${endToSec} 에서부터 1초간`)
const end = searchSec(endToSec);
console.log( `${end}개 프로세스`)
console.groupEnd();
return start> end ? start : end;
function searchSec(second) {
let cnt = 0;
// 시작시간이 지금보다 보다 빠른 것들을 대상
for(let i=0; i<idx;i++){
// 지금보다 보다 종료시간이 크거나 같으면 그 구간에 해당
if(arr[i].end>=second) {
console.log(arr[i].end)
cnt++;
}
}
for(let i=idx; i<arr.length;i++){
if(arr[i].start<second+1 && arr[i].end>=second) {
console.log(arr[i].end);
cnt++;
}
}
return cnt;
}
}
function solution(lines) {
var answer = 0;
lines = lines.map(v=>v.split(' '));
const timeGraph = makeGraph(lines);
console.log(timeGraph)
timeGraph.sort((a, b) => a.start-b.start);
for(let i=0; i<timeGraph.length;i++){
answer = Math.max(interval(timeGraph,i),answer);
}
console.log(answer)
return answer;
}
changeSec 단위 통일 함수
function changeSec(time) {
const arr = time.split(':');
return (arr[0]*3600) + (arr[1]*60) + (1*arr[2]);
}
배열을 :
을 기준으로 나눈 뒤 시간 * 3600 + 분 * 60 + 초 로 환산하는 함수
arr[2]앞에 곱해준 1은 문자열을 숫자로 바꿔주기 위해서 넣어주었다
makeGraph 시작 시각, 종료 시각 배열
function makeGraph(arr) {
const graph = [];
for(let i=0; i<arr.length; i++){
const endTime = changeSec(arr[i][1]);
const startTime = Number(((endTime+0.001) - parseFloat(arr[i][2])).toFixed(3));
graph.push({start: startTime, end : endTime});
}
return graph;
}
입력으로 주어진 종료 시각을 changeSec 함수로 단위를 변경해준 뒤에 작업 시간을 빼주고
[시작 시각, 종료 시각] 배열을 만들었다
작업 시간을 빼주는 과정에서 부동소숫점 오류가 발생할 수 있기 때문에 입력으로 들어올 수 있는 최대 소숫점크기인 셋째 자리에서 반올림
interval, searchSec
interval은 사실 별다른 걸 하지 않는데 timeGraph에서 원소를 하나씩 받아서
시작 시간을 searchSec에 보내고 종료 시간을 searchSec에 보내는 역할을 한다
searchSec는 시간을 받아서 그 시간부터 1초 사이에 처리중인 작업들을 찾는 역할을 담당하고 있다
'Algorithm > 문제' 카테고리의 다른 글
programmers. 섬 연결하기 (0) | 2021.04.26 |
---|---|
programmers. 점프와 순간 이동 (0) | 2021.04.19 |
programmers. 캐시 (0) | 2021.04.15 |
programmers. 프렌즈 4블록 (0) | 2021.04.14 |
programmers. 뉴스클러스터링 (0) | 2021.04.13 |