[알고리즘]대표값

김도연·2024년 1월 2일

알고리즘

목록 보기
4/56

문제

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

[내코드]

def min(num):
    min=100
    for i in range(len(num)):
        num.append(abs(num[i]-avg))
        if(min>num[i]):
            min=num[i]
    return  min

N=int(input())
num=list(map(int,input().split()))
sum=0
for j in range(len(num)):
    sum+=num[j]
avg=round(sum/N)

for i in range (len(num)):
    if(min(num)==(num[i]-avg)):
        print("%d %d" %(avg,i+1))
        break
else:
    for j in range(len(num)):
        if(-min(num)==(num[i]-avg)):
            print("%d %d" %(avg,j+1))
            break

1.최솟값 함수 정의
2.for문을 이용해서 평균값 구하기
3.리스트 내의 값들-평균값 --> 평균값과 가장 가까운 값 구하기
4.for문내에 만족하는 값이 없으면 평균값보다 작은 인덱스를 Search

[해설코드]

n=int(input())
a=list(map(int, input().split()))
ave=round(sum(a)/n)
min=10000000
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
	

1.list의 합 구하기 : sum(리스트)
2.for문 속 idx:학생 인덱스 번호, x:학생 점수
3.enumerat출력 예시)(0, item1), (1, item2), (2, item3), … (n, itemn)

4.elif tmp==min 답이 2개나온 경우--> ex)ave=74 73 75 75 75인 경우에 어차피 if x>score 이 부분에서 false이므로 넘어간다.

❗round는 round_half_even 방식을 채택

0개의 댓글