n명의 학생이 반장선거를 할 때 과반수 이상의 득표자가 있다면 그 사람이 반장이 되는 문제.
간단하게 푸는 방법으로는 딕셔너리를 사용하면 된다.
n = int(input())
votes = {}
for _ in range(n):
name = input()
if name in votes:
votes[name] += 1
else:
votes[name] = 1
max_votes = max(votes.values())
winner = [name for name, vote in votes.items() if vote == max_votes]
if max_votes > n // 2 and len(winner) == 1:
print(winner[0])
else:
print('-1')
딕셔너리 안에 값이 없을때
votes[name] = 1
위와 같은 방법으로 새로운 키:벨류 를 생성 가능.
다른 방법으로 과반수 이상인 조건을 이용하여
n = int(input())
names = [input() for _ in range(n)]
#득표수 카운트
counts = {}
for name in names:
counts[name] = counts.get(name, 0) + 1
candidate = "-1"
#과반을 초과하는 후보 찾기
for name, count in counts.items():
if count > len(names) // 2:
candidate = name
break
print(candidate)
같은 후보면 카운트 추가, 다른 후보면 삭제, 0일때 새로운 후보면 카운트 1로 시작. 을 반복하여 마지막에 남은 후보를 과반수 이상인지 확인하여 답을 구할 수 있다.
'자료구조, 알고리즘' 카테고리의 다른 글
2차원 최대구간합 문제 (0) | 2024.03.30 |
---|---|
구간합 카데인 알고리즘 (0) | 2024.03.22 |
BFS미로찾기 (1) | 2024.03.22 |
집합 set, 리스트 슬라이싱 (0) | 2024.01.19 |
이진트리, 전/중/후위순회, n개의 객체 만들기, enumerate (0) | 2024.01.12 |