কম্পিউটার টিউটোরিয়াল

পাইথনে স্মলেস্ট সফিশিয়েন্ট টিম (Smallest Sufficient Team)


সমস্যা বিবরণ

প্রজেক্টের জন্য প্রয়োজনীয় স্কিলের লিস্ট req_skills এবং মানুষের লিস্ট people (প্রতিটি ব্যক্তির স্কিল লিস্ট) দেওয়া থাকে। সব রিকোয়ার্ড স্কিল কভার করে এমন সবচেয়ে ছোট টিম (ইন্ডেক্স লিস্ট) বের করুন।

উদাহরণ

req_skills = ["java","flutter","android"], people = [["java"],["android"],["flutter","android"]] → আউটপুট: [0,2]

ব্যক্তি ০ (java) + ব্যক্তি ২ (flutter, android) = সব স্কিল কভার।

এলগরিদম (Bitmask DP)

  1. প্রতিটি স্কিলকে একটি বিট পজিশনে ম্যাপ করুন: skill -> bit index।
  2. dp[mask] = team_indices — mask স্কিল সেট অর্জন করতে ন্যূনতম টিম।
  3. dp[0] = [] দিয়ে শুরু।
  4. প্রতিটি ব্যক্তি i এর জন্য:
    • তাঁর স্কিল থেকে cur_mask বানান।
    • বিদ্যমান সব mask এর সাথে new_mask = mask | cur_mask করুন।
    • যদি new_mask এখনও নেই বা ছোট টিম দিয়ে সম্ভব → dp[new_mask] = dp[mask] + [i]।
  5. dp[(1< রিটার্ন করুন (সব স্কিলের মাস্ক)।

পাইথন বাস্তবায়ন

class Solution:
    def smallestSufficientTeam(self, req_skills, people):
        dp = {0: []}
        skill_index = {v: i for i, v in enumerate(req_skills)}
        
        for i, p in enumerate(people):
            cur_skill = 0
            for skill in p:
                cur_skill |= 1 << skill_index[skill]
            
            for mask, team in list(dp.items()):
                new_mask = mask | cur_skill
                if new_mask == mask:
                    continue
                if new_mask not in dp or len(dp[new_mask]) > len(team) + 1:
                    dp[new_mask] = team + [i]
        
        return dp[(1 << len(req_skills)) - 1]

ob = Solution()
print(ob.smallestSufficientTeam(["java","flutter","android"], 
                                [["java"],["android"],["flutter","android"]]))  # [0, 2]

ইনপুট / আউটপুট

ইনপুট: ["java","flutter","android"], [["java"],["android"],["flutter","android"]]
আউটপুট: [0, 2]
  1. হোয়াটসঅ্যাপ কী?

  2. পাইথনে লিফ থেকে ছোট স্ট্রিং বের করা

  3. পাইথনে BST-এ Kth Smallest Element (K-তম ক্ষুদ্রতম উপাদান)

  4. পাইথন প্রোগ্রাম লিস্টে সবচেয়ে ছোট সংখ্যা বের করা