Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 가장 작은 충분한 팀

<시간/>

프로젝트에 req_skills라는 필수 기술 목록과 사람 목록이 있다고 가정합니다. 여기 i-th people people[i]에는 그 사람이 가진 기술 목록이 포함되어 있습니다.

이제 충분한 팀이 req_skills의 모든 필수 기술에 대해 해당 기술을 가진 팀에 한 명 이상의 사람이 있는 것과 같은 사람들의 집합으로 정의된다고 가정합니다. 각 사람의 인덱스로 이러한 팀을 나타낼 수 있습니다. 예를 들어 팀이 [0, 1, 3]이라고 가정해 보겠습니다. 이것은 사람[0], 사람[1] 및 사람[3] 기술을 가진 사람을 나타냅니다.

가능한 가장 작은 규모의 팀을 찾아야 합니다.

어떤 순서로든 답을 반환할 수 있습니다. 답은 반드시 존재합니다.

따라서 입력이 req_skills =["java","flutter","android"], people =[["java"],["android"],["flutter","android"]]와 같은 경우 출력은 [0,2]

가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • dp :=하나의 맵, 키 0에 해당하는 빈 목록 추가

  • key :=값은 req_skills에서 가져오고 i는 숫자인 (value,i)와 같은 맵

  • 숫자의 경우 people 배열에서 사람 쌍(i, p)을 가져오고 번호를 할당합니다. -

    • current_skill :=0

    • p의 기술

      • current_skill :=current_skill OR 2^key[스킬]

    • for (skill_set,members) 쌍은 dp 키-값 쌍에 있습니다 -

      • total_skill :=Skill_set 또는 current_skill

      • total_skill이 Skill_set과 같으면 -

        • 다음 부분은 무시하고 다음 반복으로 건너뜁니다.

      • total_skill이 하지 않거나 크기가 dp[total_skill]> 구성원 크기 + 1인 경우

        • dp[total_skill] :=회원 + [i]

  • 반환 dp[(1 <

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

class Solution(object):
   def smallestSufficientTeam(self, req_skills, people):
      dp = {0:[]}
      key = {v:i for i,v in enumerate(req_skills)}
      for i,p in enumerate(people):
         current_skill = 0
         for skill in p:
         current_skill |= 1<< key[skill]
      for skill_set, members in dp.items():
         total_skill = skill_set|current_skill
         if total_skill == skill_set:
            continue
         if total_skill not in dp or len(dp[total_skill])>
len(members)+1:
            dp[total_skill] = members + [i]
      return dp[(1<<len(req_skills)) - 1]
ob = Solution()
print(ob.smallestSufficientTeam(["java","flutter","android"],
[["java"],["android"],["flutter","android"]]))

입력

["java","flutter","android"]
[["java"],["android"],["flutter","android"]]

출력

[0,2]