문제
대표값
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()))
sum = 0
# 평균 구하기
for x in arr :
sum += x
avg = round(sum/n)
#print(avg)
# 차이 구하기
diffArr = []
for i in range(n):
diffArr.append(abs(avg-arr[i]))
#print(diffArr)
# 절대값의 최소값 구하기
arrMin = float('inf')
index = -1
for i in range(n):
if diffArr[i] < arrMin:
arrMin = diffArr[i]
index = i
#print(arrMin)
#print(-arrMin)
#print(index)
#절대값이 최소값인 것 찾기
result = 0
for i in range(n):
if diffArr[i] == -arrMin:
result = i + 1
break
else:
result = index + 1
#print(result)
print(avg, result)
점수

강사님 풀이
#import sys
#sys.stdin=open("input.txt", "r")
n = int(input())
a = list(map(int,input().split()))
min = 2147000000
#평균 구하기
ave = round(sum(a)/n) # sum 은 리스트의 모든 값 합해
#평균과 가까운 값 탐색
for idx, x in enumerate(a): # a 리스트의 값 (0,a[0]) 이 반환 idx = 0, x = a[0] 이 됨
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)
# 절대값이 작은 값일땐 계속 작은값을 넣는식, 절대값이 같은 값일땐 큰값을 넣음
# 73 75 73 75 일때, 평균이 74
# 처음에 x 가 73일때 1이 min 이 된다, tmp 는 1
# 다음에 x 가 75알때 tmp 가 1 이므로 elif 에서 75 > score인 73 이므로 75가 score 가 됨
# 다음에 x 가 73일때 tmp 가 1 이므로 elif 에서 73 > score인 75 false 이므로 넘어감
# 다음에 x 가 75일때 tmp 가 1 이므로 elif 에서 75 > score인 75 false 이므로 넘어감
# 답은 가장 앞에 있는 75
# enumerate 활용
# 최대값, 최소값 구하기
# 대표값 문제 오류 수정, 반올림 round_half_up 하기
# 대표값 문제 오류 수정
# 우리가 아는 반올림은 round_half_up 방식 ( 5 이상 올림 )
# Python 의 round 는 round_half_even 방식을 택한다
# round_half_even 방식
a = 4.500
print(round(a)) # 4
# 정확히 하프 지점에 있으면 짝수(even)값으로 근사값 해줌
# ex) 4 와 5 의 하프지점에 있으므로 4로 간다
a = 4.5111 # 정확한 하프가 아니면 올라간다
print(round(a)) # 5
a = 5.5000
print(round(a)) # 6 (짝수로 간다)
a = 66.5
print(round(a)) # 66
# 소수 첫째자리에서 무조건 반올림 하는 법
a = 66.5
a = a + 0.5
# 66.5 여도 0.5 더하면 67, 66.6 이어도 0.5 더하면 67.1 로 자리올림 일어남
a=int(a) # 소수점 없어짐, 내림됨
print(a) # 처음의 a 에서 반올림한 67이 출력
# 66.4 이면 0.5 더해도 66.9 -> 66 이므로 올림안됨, 맞음
'코딩테스트 > 파이썬 코테 기본 강의' 카테고리의 다른 글
파이썬 알고리즘 문제풀이 : Section 2-6 / 자릿수의 합 (0) | 2022.09.24 |
---|---|
파이썬 알고리즘 문제풀이 : Section 2-5 / 정다면체 (0) | 2022.09.24 |
파이썬 알고리즘 문제풀이 : Section 2-3 / k번째 큰 수 (1) | 2022.09.19 |
파이썬 알고리즘 문제풀이 : Section 2-2 / k번째 수 (1) | 2022.09.19 |
파이썬 알고리즘 문제풀이 : Section 2-1 / k번째 약수 (0) | 2022.09.19 |