https://www.acmicpc.net/problem/9017
해당문제는 구현에 충실하면 충분할 수 있는 문제라고 생각했다.
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번째로 들어온 사람을 기준으로 정렬했다.
그러나 틀렸다...
반례가 뭔지, 어디서 틀렸는지 감도 오질 않는다...ㅠㅠ