เรื่องมีอยู่ว่า โลกของเรามี Search Engine อยู่หลายเจ้า
แต่รู้ไหมครับว่า เราไม่สามารถใส่ keyword ตรงกับ ชื่อของ Search Engine
เช่น ถ้าคุณ search "Google" บน Google จักรวาลจะระเบิดทันที !!!
หน้าที่คุณคือปกป้องจักรวาลแห่งนี้
ระบบจะป้อนชื่อของ Search Engine ต่างๆ และรายการ keyword ต่างๆ
ระบบคุณจะต้องบอกได้ว่า ระบบคุณจะสลับ Search Engine อย่างน้อยกี่ครั้ง
อ่านต่อ
ที่นี่ วิธีคิดก็ง่ายมาก แต่ต้องรู้จัก
Set ใน F#
โครงสร้างของ Set จะเป็น binary tree ซึ่งสมาชิกจะไม่ซ้ำกัน
ทีนี้เราก็สร้าง set มา set นึง
แล้วป้อน keyword ไปเรื่อยๆ ซึ่ง Search Engine ที่จะมา search set นี้
คือ Search Engine สุดท้ายที่กำลังใส่ใน set นี้
แต่ก่อนใส่ เราก็สลับ set ใหม่เข้ามา ทีนี้เราก็ปกป้องจักรวาลได้แล้ว
ใน F# เราสามารถสรุป logic ด้านบนใน function เดียว
let solve s list =
let rec run list set times =
match list with
| [] -> times
| head::tail ->
let newSet = Set.add head set
if Set.count newSet = s
then run tail (Set.singleton head) (times+1)
else run tail newSet times
run list Set.empty 0 |> string
s คือ จำนวนของ Search Engine
list คือ รายการของ keyword
function run เป็น recursive ที่จะ return ค่าว่าต้องสลับ set กี่ครั้ง
โดยที่ ถ้ารายการ keyword หมด ([]) เราก็ return จำนวนครั้ง
แต่ถ้ามี keyword เหลืออยู่ (head::tail) เราก็เอา head ใส่ set
หลังจากนั้นก็ count สมาชิกใน set ถ้าครบตามจำนวน Search Engine ก็เริ่ม set ใหม่ และเพิ่มจำนวนครั้งเข้าไป
จบ