투표라는 문자열 목록이 있다고 가정합니다. 여기에서 각 항목은 소문자로 되어 있고 가장 높은 선호도에서 가장 낮은 선호도 순으로 후보자에 대한 투표를 나타냅니다. 여기에서 후보자의 순위는 가장 높은 선호도에서 얻은 표의 수에 따라 먼저 결정됩니다. 이제 동점이 있으면 다음으로 높은 선호도에 대해 받은 표 수 등을 확인합니다. 여전히 동점이 있으면 알파벳순으로 순위가 매겨집니다. 그래서 우리는 가장 높은 순위에서 가장 낮은 순위로 팀의 최종 순위를 찾아야 합니다.
따라서 입력이 vote =["zyx", "zxy", "xyz"]와 같으면 z가 가장 높은 선호도를 받았으므로 출력은 "zxy"가 되므로 첫 번째 순위가 지정됩니다. 그런 다음 x는 두 번째로 높은 선호도를 얻었고 y는 가장 높은 선호도 표를 받지 못했습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- count :=투표의 문자열 길이
- cand :=각 키가 크기 카운트의 목록이 될 빈 맵이고 처음에는 0으로 채워집니다.
- 투표의 각 v에 대해 다음을 수행합니다.
- v의 각 인덱스 i와 값 c에 대해
- cand[c, i] 1 증가
- 값을 기준으로 항목을 내림차순으로 정렬하고 값이 같으면 알파벳순으로 정렬
- 정렬된 요소를 연결하여 문자열을 반환합니다.
- v의 각 인덱스 i와 값 c에 대해
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
from collections import defaultdict class Solution: def solve(self, votes): count = len(votes[0]) cand = defaultdict(lambda: [0] * count) for v in votes: for i, c in enumerate(v): cand[c][i] += 1 return "".join(sorted(cand.keys(), key=lambda x: (cand[x], -ord(x)), reverse=True)) ob = Solution() votes = ["zyx", "zxy", "xyz"] print(ob.solve(votes))
입력
["zyx", "zxy", "xyz"]
출력
zxy