문제

대표값


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 이므로 올림안됨, 맞음

+ Recent posts