반응형
문제
n명의 학생 수학 점수가 주어지고, 학생들의 평균을 구하고 평균에 가장 가까운 학생은 몇 번째 학생인지 출력하시오.
단, 평균과 가장 가까운 점수가 여러개 일 경우 점수가 높은 학생의 번호를 출력하고, 높은 점수를 가진 학생이 여러명일 경우 학생 번호가 가장 빠른 번호를 출력하시오.
주의
평균을 구하기 위해 합계를 구하는 함수 | sum()
소수 점 첫째 자리까지 구하는 함수 | round()
절대 값을 구하는 함수 | abs()
리스트의 인덱스 값과 실제 값을 쌍으로 대입해 주는 함수 | enumberate()
++추가사항
round() 함수가 소수 점 첫째 자리까지 구하는 함수라고 적었는데 파이썬에서는 round_half_up 방식이 아닌 round_half_even 방식을 택하고 있기 때문에 짝수와 가까운 근사값을 갖도록 합니다.
아래 주석과 위에 설명은 수정하지 않고 놔두겠습니다.
avg=round(sum(a)/n)
대신에
avg = sum(a)/n
avg=avg+0.5
avg=int(avg)
이렇게 쓸 수 있습니다.
풀이
n = int(input())
a = list(map(float, input().split()))
#소수 첫째 자리에서 반올림하기 위해 round()함수를 사용합니다.
#평균을 구하기 위해 값을 다 더해야 하므로 sum()함수를 사용합니다.
avg=round(sum(a)/n)
#정수 자료형의 최대값을 min값으로 줍니다. (비교를 위해서)
min = 2147000000
#임시 변수 idx, x를 만들어 줍니다.
#idx에는 인덱스 값이 들어가고 (학생 번호)
#x에는 리스트에 있는 값이 들어갑니다. (성적)
for idx, x in enumerate(a):
#tmp라는 임시 변수를 만들어 abs()함수로 절대값을 구해줍니다.
#평균 점수가 같을 경우 빠른 인덱스 값을 가지고 있는 학생을 출력하기 위해 절대적 거리를 만들어 줍니다.
#tmp의 값이 가장 작은 값이 평균에 가장 가까운 값입니다.
tmp=abs(x-avg)
#tmp가 읽을 최소값을 설정해 줍니다.
if tmp<min:
#작은 값을 유지하기 위해 작은 값에 더 작은 값을 넣어줍니다.
min=tmp
#score에 점수 값도 가지고 있어야 합니다. 거리가 같을 때 답에 대한 값도 출력해야 하기 때문입니다.
score=x
#0번 인덱스를 가진 학생의 실제 번호는 1번입니다.
res=idx+1
# 같은 거리일 경우도 계산하기 위해 elif문을 사용해 줍니다.
# tmp(거리가) 같은 경우에 점수가 큰 학생이 답이 되기 위해 if를 넣어줍니다.
elif tmp==min:
# x는 현재 학생의 점수, score는 이전 학생의 점수
if x>score:
# 점수가 큰 현재 학생의 점수를 score에 넣어 갱신해 줍니다.
score=x
#점수가 큰 학생으로 바꾸기 위해 +1을 합니다.
res=idx+1
# 평균과 학생 번호를 출력해 줍니다.
print(avg, res)
주석을 참고하면 됩니다.
반응형
'Algorithm > 파이썬 알고리즘 문제풀이 (코딩테스트대비)' 카테고리의 다른 글
[파이썬 알고리즘 문제풀이] : 정다면체 (0) | 2021.12.16 |
---|---|
[파이썬 알고리즘 문제풀이] : K번째 수 (0) | 2021.12.10 |
[파이썬 알고리즘 문제풀이] : k번째 큰 수 (0) | 2021.12.08 |
[파이썬 알고리즘 문제풀이] : 최소 값 구하기 (0) | 2021.12.08 |
[파이썬 알고리즘 문제풀이] : K번째 약수 (0) | 2021.12.05 |
댓글