📖 문제

level3 셔틀버스

✏️ 나의 풀이

이 문제는 단순히 구현문제이기에 그리 어렵지는 않았다.

우선, 크루가 대기역에 도착하는 시간을 모은 배열 timetable을 문자열이 아닌 숫자로 비교하여 오름차순으로 정렬해준다.

const timeSort = (a, b) => {
    const [h1, m1] = a.split(":").map(Number);
    const [h2, m2] = b.split(":").map(Number);
    return h1 * 60 + m1 - (h2 * 60 + m2);
};

function solution(n, t, m, timetable) {
  timetable.sort(timeSort);
}


그 다음 각 버스에 어떤 시간에 도착한 사람이 타고 있는지를 저장하고 있을 배열과 버스가 도착하는 시간을 담은 배열을 각각 만들어 주었다.

const bus = new Array(n).fill(0).map((_) => []);
const busTime = new Array(n).fill(0).map((v, i) => 9 * 60 + t * i);


그 다음 정렬해둔 timetable을 기준으로 반복문을 돌려 먼저 도착한 사람먼저 알맞은 버스에 탈 수 있도록 bus 배열에 저장해 둔다.

이때, timetable에는 아직 문자열로 저장되어 있기에 hh:mm 을 분을 기준으로 숫자로 변환해준다. 그리고 이를 busTime에 있는 시간과 비교해 알맞은 버스를 탈 수 있도록 한다.

for (let i = 0; i < timetable.length; i++) {
  const [hh, mm] = timetable[i].split(":").map(Number);
  const time = hh * 60 + mm;
  for (let j = 0; j < bus.length; j++) {
    if (busTime[j] >= time && bus[j].length < m) {
      bus[j].push(time);
      break;
    }
  }
}


알맞은 버스에 탈 수 있는 조건은 busTime[j]의 값이 현재 크루의 시간 이상이거나 현재 버스에 최대 탈수 있는 크루의 수보다 작은 경우이다.

이 경우 더이상 해당 크루가 버스에 탈 수 있는지 비교할 필요가 없으므로 break 문을 선언한다.


위의 반복문이 종료되면 이제 timetable에 있는 모든 크루들이 탈 수 있는 버스를 정해주었다.

이제 마지막으로 콘이 탈 수 있는 가장 마지막 버스를 타기 위해 도착해야하는 시간을 찾아보자


가장 마지막 버스를 타야하기에 우선 가장 마지막 버스에 몇명이 타고 있는지를 확인한다.

만일 최대 수용인원보다 적으면 버스가 도착하는 시간에 콘이 도착하면 된다.

그게 아니라 더이상 탈 수가 없다면 가장 마지막에 도착한 사람보다 콘이 1분더 일찍 도착하면 된다.

const numToTime = (num) => {
  const hh = "00" + Math.floor(num / 60).toString();
  const mm = "00" + (num % 60).toString();
  return hh.slice(-2) + ":" + mm.slice(-2);
};

const lastTime = bus[bus.length - 1];
const lastCrew = lastTime[lastTime.length - 1];
if (lastTime.length < m) {
  return numToTime(busTime.pop());
}
return numToTime(lastCrew - 1);

numToTime은 현재 숫자로 되어 있는 것들을 hh:mm 형식에 맞추어 주기 위해 만들어둔 함수다.

👩‍💻 코드

const timeSort = (a, b) => {
    const [h1, m1] = a.split(":").map(Number);
    const [h2, m2] = b.split(":").map(Number);
    return h1 * 60 + m1 - (h2 * 60 + m2);
};
const numToTime = (num) => {
  const hh = "00" + Math.floor(num / 60).toString();
  const mm = "00" + (num % 60).toString();
  return hh.slice(-2) + ":" + mm.slice(-2);
};
function solution(n, t, m, timetable) {
  timetable.sort(timeSort);
  const bus = new Array(n).fill(0).map((_) => []);
  const busTime = new Array(n).fill(0).map((v, i) => 9 * 60 + t * i);
  for (let i = 0; i < timetable.length; i++) {
    const [hh, mm] = timetable[i].split(":").map(Number);
    const time = hh * 60 + mm;
    for (let j = 0; j < bus.length; j++) {
      if (busTime[j] >= time && bus[j].length < m) {
        bus[j].push(time);
        break;
      }
    }
  }
  const lastTime = bus[bus.length - 1];
  const lastCrew = lastTime[lastTime.length - 1];
  if (lastTime.length < m) {
    return numToTime(busTime.pop());
  }
  return numToTime(lastCrew - 1);
}

댓글남기기