본문 바로가기

카테고리 없음

파이썬) 크로스 컨트리 - BOJ (다시풀어야함)

https://www.acmicpc.net/problem/9017

 

9017번: 크로스 컨트리

입력 데이터는 표준입력을 사용한다. 입력은 T 개의 테스트 케이스로 주어진다. 입력 파일의 첫 번째 줄에 테스트 케이스의 수를 나타내는 정수 T 가 주어진다. 두 번째 줄부터는 두 줄에 하나의

www.acmicpc.net

해당문제는 구현에 충실하면 충분할 수 있는 문제라고 생각했다.

from collections import Counter


tc = int(input())

answer = []


def solution():
    n = int(input())

    arr = list(map(int, input().split()))

    # 팀별 참가자 수
    teams = Counter(arr)

    dic = {}

    point = 1

    for i in range(len(arr)):

        if teams[arr[i]] == 6:
            if arr[i] not in dic:
                dic[arr[i]] = [1, point, 1000, arr[i]]

            else:
                if dic[arr[i]][0] <= 4:
                    dic[arr[i]][1] += point

                elif dic[arr[i]][0] == 5:
                    dic[arr[i]][2] = i

                dic[arr[i]][0] += 1
                point += 1

    a = list(dic.values())
    a.sort(key=lambda x: (x[1], x[2]))

    print(a[0][3])
    # 0번째(정ㅁ수)를 기준으로 정렬 후 2번째(5번째 사람의 상대점수)를 기준으로 정렬
    # a.sort(key=lambda x: x[0])
    # print(arr[0][0], arr[1][0])
    # print(a)
    # if a[0][0] == a[1][0]:
    # a.sort(key=lambda x: (x[0], x[2]))

    # print(a[0][3])


for _ in range(tc):
    solution()

# for i in answer:
#     print(i)

내가 처음 제출한 코드이다.

Counter 모듈로 팀원을 센 다음 6명이 안되는 팀들을 제외하고 점수와 5등의 등수를 계산, 정답을 도출했다.

그러나 성공하지 못했다.

끝끝내 반례를 찾지 못했다.

import sys
input = sys.stdin.readline

t = int(input())

for i in range(t):
    n = int(input())
    team = list(map(int, input().strip().split()))

    manage = {}
    for j in range(n):
        if team[j] not in manage:
            # 팀 명수, 선수들 점수리스트, 점수합계
            manage[team[j]] = [1, [], 0]
        else:
            manage[team[j]][0] += 1

    # 선수들의 수가 조건에 맞지 않는 팀을 우선걸러낸다
    contain = set(k for k, v in manage.items() if v[0] < 6)

    grade = 1
    for j in range(n):
        # 점수계산에서 제외해야 하는 선수가 아니라면
        if team[j] not in contain:
            manage[team[j]][1].append(grade)
            # 점수를 더하는건 상위 4명의 점수까지만 합산
            if len(manage[team[j]][1]) <= 4:
                manage[team[j]][2] += grade
            grade += 1

    answer = []
    for k, v in manage.items():
        if len(v[1]) != 0 and v[2] != 0:
            answer.append([k, v[1][4], v[2]])

    a = sorted(answer, key=lambda x: (x[2], x[1]))
    print(a[0][0])

다른 사람의 코드이다.

마찬가지로 6명이 안되는 팀들을 걸러내고 점수를 계산하였다.

저 6명이 안되는 팀들 선별하는 것을 Counter모듈로 구현하였고, 각 팀의 4등까지 점수를 계산한 이후, 점수를 기준으로 정렬하고 5번째로 들어온 사람을 기준으로 정렬했다.

그러나 틀렸다... 

반례가 뭔지, 어디서 틀렸는지 감도 오질 않는다...ㅠㅠ