โจทย์กำหนดลำดับที่ประกอบไปด้วยเลขสามหลัก n ตัว ให้หาว่ามีกี่คู่ตัวเลขที่มีตัวเลขตรงกันอย่างน้อยหนึ่งหลัก
วิธีหนึ่งที่ง่ายที่สุดคือการตรวจสอบทั้งหมด (2n) คู่ดูว่ามีอย่างน้อยหนึ่งหลักตรงกันหรือไม่ แต่จะไม่ได้คะแนนเต็มเพราะ Time Complexity O(n2) ช้าเกินไปสำหรับกรณีที่ n มีค่ามากถึง 100000
เราสามารถลดเวลาการทำงานได้สองวิธี
Solution 1: Counting
หากข้อมูลนำเข้าประกอบไปด้วยเลข 123 10 ตัว และ 159 5 ตัว สังเกตว่าจำนวนคู่ทั้งหมดจะนับได้จาก
- เลข 123 จับคู่กันเอง (210)=45 คู่
- เลข 159 จับคู่กันเอง (25)=10 คู่
- เลข 123 จับคู่กับ 159 ได้ 10×5=50 คู่
รวมเป็นทั้งหมด 105 คู่
จากตัวอย่างนี้ ทำให้เราคิดวิธีแก้โจทย์กรณีทั่วไปได้ ขั้นตอนวิธีการแก้ปัญหาเป็นดังนี้
- นับว่ามีเลข 000,001,002,…,999 ทั้งหมดกี่ตัว ในที่นี้จะนิยามให้ cnti = จำนวนครั้งที่เลข i ปรากฏ
- นับจำนวนคู่ที่เกิดจากการจับคู่เลขเดียวกันเอง ได้ i=000∑999(2cnti) คู่
- นับจำนวนคู่ที่เกิดจากการจับคู่เลขที่มีอย่างน้อยหนึ่งหลักซ้ำกัน สำหรับเลข i กับ j จะจับคู่ได้ทั้งหมด cnti×cntj คู่
- ตอบผลรวมจำนวนที่ได้จากขั้นที่ 2 และ 3
Solution 2: Inclusion—Exclusion
กำหนดให้
- H คือเซตของคู่จำนวนที่มีเลขในหลักร้อยตรงกัน
- T คือเซตของคู่จำนวนที่มีเลขในหลักสิบตรงกัน
- U คือเซตของคู่จำนวนที่มีเลขในหลักหน่วยตรงกัน
เราต้องการหา ∣H∪T∪U∣ ซึ่งสามารถหาได้จาก Inclusion—Exclusion principle:
∣H∪T∪U∣=∣H∣+∣T∣+∣U∣−∣H∩T∣−∣H∩U∣−∣T∩U∣+∣H∩T∩U∣
ดังนั้น ระหว่างรับตัวเลขแต่ละตัวในข้อมูลนำเข้า เราจะนับว่ามีตัวเลขกี่ตัวที่มี
- หลักร้อย, หลักสิบ, หลักหน่วย เป็น 0,1,2,…,9 (เรียกว่า hi,ti,ui โดย i=0,1,2,…,9)
- หลักร้อยและสิบ, หลักร้อยและหน่วย, หลักสิบและหน่วย เป็น 00,01,02,…,99 (เรียกว่า hti, hui, tui โดย i=00,01,…,99)
- ทั้งสามหลักเป็น 000,001,002,…,999 (เรียกว่า htui โดย i=000,001,002,…,999)
เราสามารถนับได้ว่ามีกี่คู่ตัวเลขที่มีหลักร้อยตรงกัน (∣H∣)ได้จาก i=0∑i=9(2hi) ส่วนหลักอื่น ๆ สามารถคิดในทำนองเดียวกัน
ดังนั้น คำตอบสุดท้ายคือ
∣H∪T∪U∣=i=0∑i=9(2hi)+i=0∑i=9(2ti)+i=0∑i=9(2ui)+i=00∑i=99(2hti)−i=00∑i=99(2hui)−i=00∑i=99(2tui)+i=000∑i=999(2htui)