58청춘 2024. 9. 28. 00:44
728x90

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

수학적으로 접근식을 생각하며 괜찬은 문제이다. 이 문제의 답은 결국 탑승 가능한 마지막 시간을 출력해야하기 때문에 대기 인원과 현재 시간을 중점으로 생각하면 점화식이 나오게된다.

 

시간을 오름차순으로 정렬했으며 각 시간마다 승객들을 탑승가능 인원수 만큼 shift() 해주었으며, 마지막 타임에 대기 인원의 유무와 대기 인원이 온 시간을 종합하여 답을 도출했다.

 

코드

function solution(n, t, m, timetable) {
  const arriveTimes = Array.from({ length: n }, (_, i) => 9 * 60 + (i * t));
  const sortedTime = timetable.map(e => {
    const [hour, minute] = e.split(':');
    return +hour * 60 + +minute;
  }).sort((a, b) => a - b);
    
  for (let i = 0; i < arriveTimes.length; i++) {
    const cur = arriveTimes[i];
    const p = sortedTime.filter(e => e <= cur);
    const cnt = p.length > m ? m : p.length;
        
    if (i === arriveTimes.length - 1) {
      if (cnt < m) {
        const hour = Math.floor(cur / 60);
        const minute = cur % 60
        return `${hour < 10 ? '0' + hour : hour}:${minute < 10 ? '0' + minute : minute}`;
      }
      else {
        const target = p[m - 1] - 1;
        const hour = Math.floor(target / 60);
        const minute = target % 60
        return `${hour < 10 ? '0' + hour : hour}:${minute < 10 ? '0' + minute : minute}`;
      }
    }
        
    for (let j = 0; j < cnt; j++) {
      sortedTime.shift();
    }
  }
}
728x90