코딩 테스트/백준

[Python] 백준 9017 크로스 컨트리

위시리 2025. 2. 3. 15:47

 

문제 분석

  • 경주 코스는 4~12km
  • 숲, 풀, 지면, 언덕, 평평한 지형
  • 개인 성적 & 팀 점수
  • 한 팀은 6명 → 팀 점수 : 상위 4명의 주자 점수의 합
  • 점수는 자격을 갖춘 팀의 주자들에게만 주어짐
  • 결승점을 통과한 순서대로 점수를 받음
  • 가장 낮은 점수를 얻는 팀이 우승
  • 6명의 주자가 참가하지 못한 팀은 점수 계산에서 제외
  • 동점의 경우, 다섯 번째 주자가 먼저 들어온 팀이 우승

 

코드 설계

  • 조건
    1. 팀원이 6명인지 확인 → 6명인 팀만 점수 계산
    2. 동점인지 확인 (상위 4명)
    3. 동점이라면 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())))))