문제 링크
문제 풀이
배열과 루프를 활용한 구현 문제이다.
단, 주의할 점이 있다.
보통 이런 류의 문제는 버스를 기다리는 사원들(timetable)이 전부 다 탈 수 있도록 설계해서 내지만 이 문제는 그렇지 않았다.
즉 timetable 안에서 버스를 못타는 사람이 충분히 생길 수 있다.
이것을 해결하기 위해 timetable을 sort하고 n*m으로 slice하고 푼다고 해도,
아래와 같은 경우라면 버스를 못타는 사람이 또 생길 수 있다.
- 2인승 버스 3대가 준비되어있고, 9시 이전에 1명만 대기한다.
- 사람이 10명 대기하고 있어서 앞에서 6명을 잘랐다.
- 첫 버스에 1명만 탈 수 있다. 두 번째 버스에는 2명이 탄다. 마지막 버스 차례에 3명이 대기중인데 2인승이므로 1명은 낙오된다.
그래서 이 문제는 if로 분기를 잘 나누어야 한다.
전체 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| const toTime = (str) => { let hour = Math.floor(str / 60); let minute = str % 60; if (hour < 10) hour = "0" + hour; if (minute < 10) minute = "0" + minute; return hour + ":" + minute; };
function solution(n, t, m, timetable) { let remain = n * m;
timetable = timetable .map((v) => { const [hour, minute] = v.split(":"); return 60 * hour + 1 * minute; }) .sort((a, b) => a - b) .slice(0, remain);
let now = 540; let lastBus = 540 + (n - 1) * t; let thisBus = [];
while (now <= lastBus) { thisBus = [];
while (timetable.length > 0 && timetable[0] <= now && thisBus.length < m) { thisBus.push(timetable.shift()); }
if (timetable.length === 0) return thisBus.length === m ? toTime(thisBus.pop() - 1) : toTime(lastBus); if (timetable[0] > lastBus) return toTime(lastBus);
now += t; }
return timetable.length > 0 ? toTime(thisBus.pop() - 1) : toTime(lastBus); }
|