코딩 테스트/백준
[Python] 백준 9017 크로스 컨트리
위시리
2025. 2. 3. 15:47
문제 분석
- 경주 코스는 4~12km
- 숲, 풀, 지면, 언덕, 평평한 지형
- 개인 성적 & 팀 점수
- 한 팀은 6명 → 팀 점수 : 상위 4명의 주자 점수의 합
- 점수는 자격을 갖춘 팀의 주자들에게만 주어짐
- 결승점을 통과한 순서대로 점수를 받음
- 가장 낮은 점수를 얻는 팀이 우승
- 6명의 주자가 참가하지 못한 팀은 점수 계산에서 제외
- 동점의 경우, 다섯 번째 주자가 먼저 들어온 팀이 우승
코드 설계
- 조건
- 팀원이 6명인지 확인 → 6명인 팀만 점수 계산
- 동점인지 확인 (상위 4명)
- 동점이라면 5번째 값 비교
- 각 팀의 인원 수 체크
- 팀원이 6이면 해당 값을 key로 정하고 인덱스+1 값을 리스트로 넣기
- 주의! 있는 사람들로만 등수를 매김..
- 상위 4개의 값 합을 확인
- 동점자가 있다면 4번째 (0부터 시작하니까) 인덱스의 값-1 비교
정답 코드
import sys
input = sys.stdin.readline
tc = int(input())
for _ in range(tc) :
n = int(input())
rank = list(map(int, input().split()))
dic = {}
# 6명이 안되는 팀 제거
team = set(rank) # 몇 팀이 있는지 확인
for t in team :
if rank.count(t) != 6 : # 6명이 충족하지 않으면 제거
while t in rank :
rank.remove(t)
# 각 팀 / 팀원에 대한 등수 입력
for r in range(len(rank)) :
if rank[r] not in dic.keys() : # 만약 아직 dic에 생성되지 않았으면 삭제
dic[rank[r]] = []
dic[rank[r]].append(r+1)
winner = {} # team, score
for k, v in dic.items():
if len(winner) == 0 : # 아직 우승자가 없으면 처음 오는 팀이 우선 우승팀
winner[k] = v
else :
if sum(winner[list(winner.keys())[0]][:4]) > sum(dic[k][:4]): # 더 작은게 이기는거
del winner[list(winner.keys())[0]]
winner[k] = v
elif sum(winner[list(winner.keys())[0]][:4]) == sum(dic[k][:4]):
winner_key = int(''.join(map(str, list(winner.keys()))))
if dic[winner_key][4] > dic[k][4] :
del winner[list(winner.keys())[0]]
winner[k] = v
print(int(''.join(map(str, list(winner.keys())))))