코딩테스트 연습 - [1차] 추석 트래픽 | 프로그래머스 스쿨
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
1. 주어진 입력을 파싱해서 ms단위로 변환한다
2. 가장 트래픽 처리량이 많은 구간을 찾는다
주어진 문자열에서 앞부분(날짜)는 의미가 없으므로 전부 버린다.
나머지 hh:mm:ss.sss 부분을 String.prototype.split 함수로 자른다.
처리 시간 T도 마찬가지로 ss.sss를 자른다.
각각 계수를 곱해서 ms단위의 시간으로 변환한다.
처리 시작시간과 처리 종료시간을 각각 처리한다.
변환한 데이터를 정렬한다.
여기까지의 코드
for (var i = 0; i < lines.length; i++) {
const [Z, S, T] = lines[i].split(' ');
const [hh, mm, ss, sss] = S.split(/:|\./);
const [ds, dss] = T.split(/\.|s/);
begin.push(3600000 * +hh + 60000 * +mm + 1000 * (+ss - +ds) + (+sss - +dss));
end.push(3600000 * +hh + 60000 * +mm + 1000 * +ss + +sss);
}
begin.sort((a, b) => a - b);
end.sort((a, b) => a - b);
그 다음 할 일은 1초 구간동안 가장 많은 처리량을 찾는 것이다.
처리량을 체크할 가상의 구간을 만든다. 구간의 맨 앞은 head, 맨 뒤는 tail로 지정했다.
head로부터 가장 가까운 처리 시작시간과 tail로부터 가장 가까운 처리 종료 시간을 찾는다.
둘을 비교해 더 작은 값을 가린다. 가상의 구간을 그만큼 앞으로 움직인다.
만약 처리 시작시간이 더 가까웠다면 처리량을 1 증가시킨다.
만약 처리 종료시간이 더 가까웠다면 처리량을 1 감소시킨다.
더이상 처리 시작시간 데이터가 없을때까지 진행한다.
전체 코드
function solution(lines) {
var answer = 0;
var begin = [];
var end = [];
for (var i = 0; i < lines.length; i++) {
const [Z, S, T] = lines[i].split(' ');
const [hh, mm, ss, sss] = S.split(/:|\./);
const [ds, dss] = T.split(/\.|s/);
begin.push(3600000 * +hh + 60000 * +mm + 1000 * (+ss - +ds) + (+sss - +dss));
end.push(3600000 * +hh + 60000 * +mm + 1000 * +ss + +sss);
}
begin.sort((a, b) => a - b);
end.sort((a, b) => a - b);
var head = begin[0] - 1;
var tail = begin[0] - 1000;
var i = 0, j = 0;
var count = 0;
while (i < begin.length) {
var toBegin = begin[i] - head;
var toEnd = end[j] - tail;
if (toBegin < toEnd) {
head += toBegin;
tail += toBegin;
count++;
if (count > answer) answer = count;
i++;
} else {
head += toEnd;
tail += toEnd;
count--;
j++;
}
}
return answer;
}
결과

후기
대단히 어려운 알고리즘이나 자료구조를 사용하지는 않았지만, 코드를 설계하고 구현함에 있어서 집중하지 않으면 헤매일수 있는 문제라고 생각한다. 애초에 문제를 읽는것부터가 힘들었다. 단순히 가장 큰 순간 처리량을 구했는데 틀려서 문제를 처음부터 다시 읽었다. 코드가 좀 길고 너저분한 것 같아서 마음에 안든다. 특히 마지막 while문이 그렇다.
'코딩연습' 카테고리의 다른 글
| (C#) 아이템 줍기 (0) | 2025.05.28 |
|---|---|
| (C#)순위 (0) | 2025.05.23 |
| (javascript) 최고의 집합 (0) | 2025.05.13 |
| (javascript) 올바른 괄호의 갯수 (0) | 2025.05.11 |
| (javascript) 셔틀버스 (0) | 2025.05.07 |