대표값
N명의 학생의 수학점수가 주어집니다.
N명의 학생들의 평균(소수 첫째자리 반올림)을 구하고, N명의 학생 중 평균에 가장 가까운 학생은 몇 번째 학생인지 출력하는 프로그램을 작성하세 요.
평균과 가장 가까운 점수가 여러 개일 경우 먼저 점수가 높은 학생의 번호를 답으로 하고,
높 은 점수를 가진 학생이 여러 명일 경우 그 중 학생번호가 빠른 학생의 번호를 답으로 합니다.
▣ 입력설명
첫줄에 자연수 N(5<=N<=100)이 주어지고, 두 번째 줄에는 각 학생의 수학점수인 N개의 자연 수가 주어집니다.
학생의 번호는 앞에서부터 1로 시작해서 N까지이다.
▣ 출력설명
첫줄에 평균과 평균에 가장 가까운 학생의 번호를 출력한다. 평균은 소수 첫째 자리에서 반올림합니다.
▣ 입력예제 1
10
45 73 66 87 92 67 75 79 75 80
▣ 출력 예제 1
74 7
예제설명)
평균이 74점으로 평균과 가장 가까운 점수는 73(2번), 75(7번), 75(9번)입니다. 여기서 점수가 높은 75(7번), 75(9번)이 답이 될 수 있고, 75점이 두명이므로 학생번호가 빠른 7번이 답이 됩니다.
나의 코드
n=int(input())
arr=list(map(int,input().split()))
s=sum(arr)
avg=round(s/n+0.1)
res=[]
Mins=100
for i in range(n):
if Mins> abs(avg-arr[i]):
Mins=abs(avg-arr[i])
for i in range(n):
if abs(avg-arr[i])==Mins:
res.append(i)
for x in res:
if arr[x]>=avg:
print(avg,x+1)
break
else:
print(avg,res[0])
round 함수는 12.5를 반올림하면 12로 출력한다.
그래서 해당 반올림하는 변수에 0.1을 더한 뒤 round 함수에 넣어서 반올림을 구한다.
반복문을 사용하여 평균을 구한뒤 평균과 학생의 점수 하나씩 비교하며 가장 작은 차를 구해 Mins에 대입한다,
그리고 다른 반복문을 사용하여 평균과 점수차가 Mins인 학생의 인덱스를 res에 저장한 뒤
평균보다 높은 점수를 가진 학생의 점수가 있으면 그 해당 학생의 인덱스를 반환하고 종료.
없다면 res에 처음 저장된 학생의 인덱스를 반환
정답 코드
import sys
#sys.stdin=open("input.txt", "r")
n=int(input())
a=list(map(int, input().split()))
ave=sum(a)/n
ave=ave+0.5
ave=int(ave)
min=2147000000
for idx, x in enumerate(a):
tmp=abs(x-ave)
if tmp<min:
min=tmp
score=x
res=idx+1
elif tmp==min:
if x>score:
score=x
res=idx+1
print(ave, res)
정답 코드에서는 round 함수 대신 0.5를 더한 뒤 Int 함수로 정수화를 시켰다.
또한 전체적인 로직 또한 나의 코드와 다르다.
정답 코드에서는 eumerate를 사용해서 for문 하나에 모든 로직을 작성하였다...!
개쩌는고마잉 뭔가 한단계를 더 보고 작성한 코드 같군..
'코딩테스트[파이썬] > 알고리즘 문제풀이 입문' 카테고리의 다른 글
[구현력 기르기] - 자릿수의합 (2) | 2024.02.04 |
---|---|
[구현력 기르기] - 정다면체 (0) | 2024.02.04 |
[구현력 기르기] -k번째 큰수 (2) | 2024.02.04 |
[구현력 기르기] - k번째 수 (0) | 2024.02.04 |
[구현력 기르기]-k번째 약수 (0) | 2024.02.04 |