폴더 분리
This commit is contained in:
79
workbook_8708/silver/9017-s3.py
Normal file
79
workbook_8708/silver/9017-s3.py
Normal file
@@ -0,0 +1,79 @@
|
||||
# 크로스 컨트리
|
||||
|
||||
import sys
|
||||
|
||||
from collections import Counter
|
||||
|
||||
input = sys.stdin.readline
|
||||
|
||||
def exclude_team(teams):
|
||||
excluded = set()
|
||||
|
||||
for team in teams:
|
||||
if teams[team] != 6:
|
||||
excluded.add(team)
|
||||
|
||||
return excluded
|
||||
|
||||
def find_winning_team(rank, excluded, team_count, n):
|
||||
team_score = {i: {"count": 0, "score": 0} for i in range(1, team_count+1) if i not in excluded}
|
||||
first_5th = {}
|
||||
now_rank = 0
|
||||
for r in rank:
|
||||
if r in excluded:
|
||||
continue
|
||||
|
||||
now_rank += 1
|
||||
|
||||
if team_score[r]["count"] >= 4:
|
||||
if first_5th.get(r, 0) == 0:
|
||||
first_5th[r] = now_rank
|
||||
continue
|
||||
team_score[r]["score"] += (now_rank)
|
||||
team_score[r]["count"] += 1
|
||||
|
||||
winner = {"team": 0, "score": float("inf"), "5th": n+1}
|
||||
for team in team_score:
|
||||
if team_score[team]["score"] < winner["score"]:
|
||||
winner["team"], winner["score"], winner["5th"] = team, team_score[team]["score"], first_5th.get(team, n+1)
|
||||
elif team_score[team]["score"] == winner["score"] and first_5th.get(team, n+1) < winner["5th"]:
|
||||
winner["team"], winner["score"], winner["5th"] = team, team_score[team]["score"], first_5th.get(team, n+1)
|
||||
else:
|
||||
continue
|
||||
|
||||
return winner["team"]
|
||||
|
||||
|
||||
def game():
|
||||
n = int(input().rstrip())
|
||||
rank = list(map(int, input().rstrip().split()))
|
||||
teams = Counter(rank)
|
||||
excluded = exclude_team(teams)
|
||||
|
||||
result = find_winning_team(rank, excluded, len(teams), n)
|
||||
|
||||
return result
|
||||
|
||||
def solution():
|
||||
t = int(input().rstrip())
|
||||
for _ in range(t):
|
||||
result = game()
|
||||
print(result)
|
||||
return
|
||||
|
||||
|
||||
solution()
|
||||
|
||||
"""
|
||||
걸린 시간: 50분 정도(score를 반대로 생각하거나, dictionary keyerror 때문에..) -> dict는 앵간하면 .get()으로 하자.
|
||||
|
||||
시간 복잡도: exclude_team()은 Counter 객체 전체를 순회하기 때문에 O(m)이다.
|
||||
find_winning_team()은 rank 전체를 순회하고 팀 리스트를 순회하는 것인데 set과 dict를 쓰므로 O(1)이라서 전체는 m < n이므로 O(n)이다.
|
||||
game()은 Counter이므로 O(m)에다가 exclude_team()과 find_winning_team()을 돌리기 때문에 전체는 O(n)이다.
|
||||
마지막으로 전체 프로그램은 game()을 t번 반복하기 때문에 전체 시간복잡도는 O(t*n)이다.
|
||||
함수별로 나눠놓으니까 전체 시간복잡도를 계산하는 것이 확실히 편하다.
|
||||
|
||||
해설: 먼저 6명이 아닌 팀을 counter로 알아낸 뒤 제외한다. 그 후 rank 리스트를 순차적으로 확인하면서 팀의 총점을 기록한다.
|
||||
이때, 4등까지만 계산을 하도록 조건을 걸어주고, 팀의 5등이 전체 몇 등인지만 dict에 저장한다.
|
||||
마지막에 총점을 비교하고, 같다면 5등까지 확인하는 절차를 거쳐서 최종 우승 팀을 결정한다.
|
||||
"""
|
||||
Reference in New Issue
Block a user