주원이는 카페를 운영하고 있습니다. 주원이의 카페는 맛집으로 소문나서 항상 줄이 끊이지 않습니다. 하지만 카페가 협소하여 커피를 기다리는 손님들은 종종 불만을 토로하고 있습니다. 주원이는 카페를 확장하기로 하고, 얼마나 많은 손님들이 동시에 카페에 머무는지 확인해보려 합니다.
주원이네 카페에는 영업을 시작하자마자 0초에 손님 한 명이 가게에 도착하고, 정확히 k
초마다 새로운 손님 한 명이 카페에 와서 줄을 섭니다. 손님들은 키오스크를 통해 주문하고, 주원이는 주문받은 순서대로 음료를 만듭니다. 주원이는 음료를 한 번에 하나씩 만들며, 지금 만들고 있는 음료를 다 만들면 다음 음료를 만들기 시작합니다. 손님은 자신이 주문한 음료를 받자마자 카페를 나갑니다. 주원이네 카페에는 여러 종류의 음료를 판매하고 있는데 각 음료들은 0번부터 차례대로 번호가 지정되어 있습니다. 또한 주원이가 같은 종류의 음료를 만드는데 걸리는 시간은 항상 동일합니다.
주원이는 오늘 주문받은 음료 목록을 이용하여, 카페에서 손님들이 동시에 최대 몇 명이 머물렀는지 알고 싶습니다. 손님들이 카페에 도착하여 주문하기까지 걸린 시간과 음료를 받은 후 카페를 나가는 시간은 음료 제조 시간에 비해 대단히 짧기 때문에 무시합니다. 한 손님이 카페에서 나감과 동시에 다른 손님이 카페에 들어올 경우, 나가는 손님이 먼저 퇴장한 다음 들어오는 손님이 입장합니다.
예를 들어, 주원이네 카페에서 세 종류의 음료를 판매하고 제조 시간은 0번 음료가 5초, 1번 음료가 12초, 2번 음료는 30초 소요된다고 가정합니다. 영업을 시작한 뒤 4명의 손님이 각각 0초, 10초, 20초, 30초에 카페에 도착하여 순서대로 1번, 2번, 0번, 1번 음료를 주문한 경우, 영업 시작 후 30초부터 42초 사이에 3명의 손님이 기다리게 되고, 이때가 동시에 기다리고 있는 손님이 가장 많은 시간입니다.
주원이네 카페에서 판매하는 각 음료들의 제조 시간을 담은 정수 배열 menu
와 오늘 손님들이 주문한 음료가 순서대로 적힌 배열 order
, 새로운 한 명의 손님이 방문하는데 걸리는 시간인 k
가 매개변수로 주어집니다. 오늘 카페에 동시에 존재한 손님 수의 최댓값을 return 하도록 solution 함수를 작성해주세요.
menu
의 길이 ≤ 100
menu[i]
는 i
번 음료의 제조 시간을 의미합니다.menu
의 원소 ≤ 100order
의 길이 ≤ 10,000
order[i]
는 i
번째 손님이 주문한 음료의 번호입니다.order
의 원소 < menu
의 길이k
≤ 100menu | order | k | result |
---|---|---|---|
[5, 12, 30] | [1, 2, 0, 1] | 10 | 3 |
[5, 12, 30] | [2, 1, 0, 0, 0, 1, 0] | 10 | 4 |
[5] | [0, 0, 0, 0, 0] | 5 | 1 |
입출력 예 #1
입출력 예 #2
입출력 예 #3
카페에 동시에 존재한 손님 수의 최댓값을 구하는 문제.
최대값은 항상 손님이 들어온 시간에 갱신된다.
손님은 주문이 완료 될때 까지 대기하며 주문이 완료되는 시간은 이전 손님의 메뉴가 준비되는 시간 + 해당 손님의 메뉴 준비시간과 손님의 입장시간 + 메뉴준비시간 중 큰값이다. 손님이 들어오는 시간마다 대기중인 손님의 최대값을 구하면 끝
function solution(menu, order, k) {
var answer = 0;
let customers = [];
order.forEach((v, i) => {
const now = i * k;
const lastorder = customers[customers.length - 1] || 0;
if (now > lastorder) customers.push(now + menu[v]);
else customers.push(lastorder + menu[v]);
customers = customers.filter((x) => x > now);
if (answer < customers.length) answer = customers.length;
});
return answer;
}