Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- TripGuard
- 소마
- 숫자 맞추기
- 2085
- MemoSprint
- barin tumor
- 24501
- k개 사과 트리 노드만으로 배를 최대로 수확하기
- Australian Voting
- paper
- 25195
- 1인개발
- 34031
- 홀수 홀릭 호석
- 7626
- 하이터치☆메모리
- TaskQ
- 백준
- Classification
- 2494
- 25977
- 외국어이름
- AI
- 소프트웨어마에스트로
- blobaww
- 개발
- God of Mine
- BOJ
- 알고리즘
- Fitmong
Archives
- Today
- Total
iwanabethedev 님의 블로그
[boj 4419] Austrailam Voting 본문
영어 문제라는 점에서 1차 난관, 구현 문제라는 점에서 2차 난관...
그냥 구현하면 되는 문제라 설명이 필요한가 싶다. 다만 주의점이 2가지 있다.
1. 브루트포스로 접근하면 시간초과 주의
2. 최저점은 여러명이 될 수 있음을 주의
이것만 주의하면서 풀면 될 듯 하다.
나는 이걸 제대로 처리 못해서 여러번 틀렸다...
더보기
import sys
input = sys.stdin.readline
def solve():
N = int(input())
num_to_name = {}
for i in range(1, N + 1):
num_to_name[i] = input().rstrip()
is_available = [1] * (N + 1)
total_num = 0
candidates = [()]
while True:
line = input()
if not line:
break
candidate = tuple(map(int, line.split()))
if not candidate:
break
candidates.append(candidate)
total_num += 1
half = total_num // 2 + 1
cnt = [0] * (N + 1)
state = [[] for _ in range(N + 1)]
# 초기 1순위 집계
for idx in range(1, total_num + 1):
first = candidates[idx][0]
cnt[first] += 1
state[first].append(idx)
idxs = [0] * (total_num + 1) # 각 투표지가 현재 가리키는 순위 인덱스
while True:
alive = [i for i in range(1, N + 1) if is_available[i]]
max_val = max(cnt[i] for i in alive)
min_val = min(cnt[i] for i in alive)
# 과반 승자
if max_val >= half:
for i in alive:
if cnt[i] == max_val:
print(num_to_name[i])
return
# 전원 동률
if max_val == min_val:
for i in alive:
print(num_to_name[i])
return
min_idxs = [i for i in alive if cnt[i] == min_val]
# 같은 라운드에서 탈락하는 후보들 먼저 전부 비활성화
for idx in min_idxs:
is_available[idx] = 0
# 탈락 후보들의 표 재분배
for idx in min_idxs:
for s in state[idx]:
while True:
idxs[s] += 1
if idxs[s] >= len(candidates[s]):
break
nxt = candidates[s][idxs[s]]
if is_available[nxt]:
cnt[nxt] += 1
state[nxt].append(s)
break
cnt[idx] = 0
state[idx] = []
def main():
solve()
if __name__ == "__main__":
main()

'알고리즘' 카테고리의 다른 글
| [boj 2494] 숫자 맞추기 (0) | 2026.03.31 |
|---|---|
| [boj 24501] blobaww (0) | 2026.03.30 |
| [boj 25195] Yes or yes (0) | 2026.03.28 |
| [boj 7626] 직사각형 (0) | 2026.03.27 |
| [20164] 홀수 홀릭 호석 (0) | 2026.03.26 |
