iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
自我挑戰組

菜鳥工程師的奇幻漂流:跟著kata活化手指和意識系列 第 18

The Supermarket Queue

今日kata

原始題目如下:(5kyu)
There is a queue for the self-checkout tills at the supermarket. Your task is write a function to calculate the total time required for all the customers to check out!
input
customers: an array of positive integers representing the queue. Each integer represents a customer, and its value is the amount of time they require to check out.
n: a positive integer, the number of checkout tills.
output
The function should return an integer, the total time required.

翻譯:請支援收銀
顧客一一排隊等待結帳,結帳櫃台一次只能負責一個客人,需計算經過多久後可以消化完等待結帳的人潮。(有兩個傳入的參數,array中的元素代表顧客,值代表替每一個顧客結帳所需的時間:n代表結帳櫃台的數量)。

範例:

queueTime([5,3,4], 1)
// 總共三個顧客,開放1個櫃台
// 時間為5+3+4=12
// 回傳12

queueTime([2,3,10], 2)
// 總共三個顧客,開放2個櫃台
// 第一號及第二號客人分別到A、B櫃台進行結帳
// A-----2
// B-----3

// 2分鐘過去
// A櫃台空了,於是第三號客人到A櫃台進行結帳
// A-----10
// B-----1 (還有1分鐘就可替2號客人結完帳)

// 再過1分鐘
// A-----9
// B-----閒置

// 再過9分鐘
// A-----閒置
// B-----閒置

// 所需時間為2+1+9=12
// 回傳12

構想&解法

function queueTime(customers, n) {
  if (customers.length === 0) return 0
  
  let check = customers.splice(0, n)
  customers.forEach(item => {
    check[check.indexOf(Math.min(...check))] += item
  })
  return Math.max(...check)
}
  • check為一陣列長度為n,代表結帳櫃台;值代表處理的顧客時間
  • 一開始將customers前n個的元素移除並存至check
  • customers要一一分配給閒置的櫃台--->即是找出check中值最小的
  • 最後花費的時間為check元素中值最大的元素

自首:其實一開始沒有頭緒該怎麼想,這個想法是上網看的概念,一看到馬上咻咻coding! 測試瞬過!


其他解法觀摩

function queueTime(customers, n) {
  var w = new Array(n).fill(0);
  for (let t of customers) {
    let idx = w.indexOf(Math.min(...w));
    w[idx] += t;
  }
  return Math.max(...w);
}

解法相似!!

推推!有文章特地整理這題的思考方式The Supermarket Queue 減法思考 vs 加法思考

以上為今日分享的內容,若有錯誤或是建議,請再隨時和我聯繫。


上一篇
Isograms
下一篇
Complementary DNA
系列文
菜鳥工程師的奇幻漂流:跟著kata活化手指和意識30

尚未有邦友留言

立即登入留言