알고리즘&문제풀이

[Softeer] HSAT 5회 기출 - 성적 평가

CSE 2025. 12. 19. 09:00

 

문제

<배경>

현주는 $N$명의 사원이 참가하는 프로그래밍 스터디 그룹을 이끌고 있다.

현주는 스터디를 위해 대회를 세 개 출제하였고, 모든 구성원이 각 대회에 참여하였다. 각 참가자는 각 대회에서  $0$이상 $1000$ 이하의 정수인 점수를 얻는다. 한 대회에서 둘 이상의 참가자가 동점이 나오는 경우도 있을 수 있다.

 

현주는 각 대회별 등수 및 최종 등수를 매기고 싶다. 등수는 가장 점수가 높은 사람부터 $1$등, $2$등, ..., $N$등의 순서대로 붙는다. 만일 동점이 있을 경우 가능한 한 높은(등수의 수가 작은) 등수를 부여한다. 즉, 점수가 내림차순으로 $10,7,6,6,4$의 순서일 경우, $6$점을 받은 두 사람은 공동 $3$등이 되고, 그 다음 순서인 $4$점을 받은 사람은 $5$등이 된다.

 

이 규칙을 다르게 표현하면 다음과 같다: 각 사람마다 "나보다 점수가 큰 사람"의 수를 세어 $1$을 더한 것이 자신의 등수가 된다. 대회별 등수는 각 대회에서 얻은 점수를 기준으로 하며 최종 등수는 세 대회의 점수의 합을 기준으로 한다.

각 참가자의 대회별 등수 및 최종 등수를 출력하는 프로그램을 작성하시오

 

<입력>

<출력>


풀이

total 리스트는 모든 대회의 점수 합을 저장할 리스트이다.

computeRanking(arr)함수는 각 대회 회차에 대해 등수를 출력하는 함수이다.

이때 동점자도 고려된다.

n= int(input())
total = [0]*n
for _ in range(3):
    scores = list(map(int,input().split()))
    for i in range(n):
        total[i] += scores[i]
    computeRanking(scores)

 

다음으로 computeRanking함수이다.

먼저 [40,80,70] 처럼 되어있는 점수를 

[[40,0],[80,1],[70,2]] 이런 형식으로 바꾼다.

정렬을 해서 순위를 매길 것인데 그냥 정렬하면 이 점수가 누구의 점수인지를 모르기 때문이다.

따라서 정렬하면 이렇게 된다.

ranking : [[81,1],[70,2],[40,0]]

def computeRanking(arr):
    ranking = [0]*n
    ans = [0]*n
    for i in range(n):
        arr[i] = [arr[i],i]
    arr.sort(reversed = True) #내림차순
    cnt = 1
    ranking[0] = 1
    for i in range(1,n):
        if arr[i][0]!=arr[i-1][0]:
            cnt+=1
        ranking[i]=cnt
    for i in range(n):
        ans[arr[i][1]] = ranking[i]
    for i in range(n):
        print(ans[i], end=' ')
    print()

if문을 통해 동점의 경우에도 정상처리가 되도록 했다.

 

오히려 HSAT기출문제가 이전 예선 문제들 보다 난이도가 낮은 것 같다.