https://www.acmicpc.net/problem/24509
Problem
혜민이네 반은 총 N명의 학생으로 이루어져 있으며 학생마다 번호가 다르게 배정되어 있다.
이번 시험은 국어, 영어, 수학, 과학 총 4과목으로 진행되며, 학생들이 공부를 열심히 할 수 있게 과목별 1등에게 상품을 주기로 했다.
조건
- 수상은 국어, 영어, 수학, 과학 순서로 하며 최대한 많은 학생에게 상품을 주고 싶기 때문에 학생마다 상품은 한 번만 받을 수 있다. 예를 들어 국어 과목에서 1등 한 사람이 수학 과목에서 또 1등을 한다면 국어 과목에서 상품을 받았기 때문에 이 학생은 다른 과목에서 상품을 더 받을 수 없다.
- 따라서 수학 과목은 상품을 받지 않은 학생 중에 점수가 가장 높은 학생이 상품을 받는다. 단, 동점이 있으면 번호가 빠른 사람이 상품을 받는다. 과목별 상 받을 사람의 번호를 출력하시오.
- 첫 번째 줄에 학생의 수 (4≤N≤200000) 주어진다.
- 두 번째 줄부터 N+1번째 줄까지 N개의 줄에 걸쳐서 학생의 번호 X(1≤X≤N)와 학생의 국어 점수 A, 영어 점수 B, 수학 점수 C, 과학 점수 D가 순서대로 공백을 기준으로 정수로 주어진다. 학생의 번호는 중복될 수 없다. (0≤A,B,C,D≤100 )
SOL
N이 매우 큰 문제이다. O(N)안에, 순서를 정하고, 비교를 해야한다. 그러기 위해서 난 Dictionary를 이용해보았다
import sys
input= sys.stdin.readline
N=int(input().rstrip())
students={}
ans=[[-1,-1] for _ in range(4)]
for i in range(N):
number,A,B,C,D=map(int,input().split())
score=[A,B,C,D]
students[number]=score
#점수 비교, 국어부터
for i in range(4):
for student in students:
#print(students[student])
if ans[i][1]<students[student][i]:
#print("Students[student]:{}".format(students[student][i]))
ans[i][0]=student
ans[i][1]=students[student][i]
if ans[i][1] == students[student][i]:
ans[i][0]=min(student,ans[i][0])
#한번 상을 받은 친구는 없애준다.
del(students[ans[i][0]])
for i in range(4):
print(ans[i][0],end=" ")
'알고리즘 문제(SOL)' 카테고리의 다른 글
[백준/1629/파이썬] 곱셈 (0) | 2022.02.22 |
---|---|
[백준/11401/파이썬] 이항계수 3 (0) | 2022.02.22 |
[백준/2234/파이썬] 성곽 (0) | 2022.02.21 |
[백준/17089/파이썬] 세 친구 (0) | 2022.02.21 |
[백준/1159/파이썬] 농구 경기 (0) | 2022.02.20 |