문제
<배경>
현주는 $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기출문제가 이전 예선 문제들 보다 난이도가 낮은 것 같다.
'알고리즘&문제풀이' 카테고리의 다른 글
| [Softeer] HSAT 7회 기출 - 자동차 테스트 (0) | 2025.12.22 |
|---|---|
| [Softeer] HSAT 6회 기출 - 염기서열 (1) | 2025.12.20 |
| [Softeer] HSAT 5회 기출 - 업무 처리 (0) | 2025.12.18 |
| [Softeer] HSAT 4회 기출 - 통근버스 출발 순서 검증하기 (1) | 2025.12.17 |
| [Softeer] HSAT 4회 기출 - 슈퍼컴퓨터 클러스터 (0) | 2025.12.16 |