bearbrick 2022. 5. 15. 03:08

*이 풀이는 인프런: 파이썬 알고리즘 문제풀이 강좌에 기반하였습니다.

 

 

 

내 풀이

 

1. 평균을 구하기 위해서 for문을 통해 총합을 구한다.

2. 평균의 소수점 첫째 자리에서 반올림하기 위해서 round( )함수를 사용한다.

3. 평균에서 가장 가까운 사람을 구하기 위해서 특정 사람의 성적과 평균간의 거리 차를 계산하고 가장 작은 거리 차를 구한다. (이 때, 거리 차가 음수라면 음수가 가장 작은 거리 차를 가지게 되므로 음수는 양수로 변환해서 비교한다.)

4. 거리 차가 같은 경우, 점수가 높은 사람이 우선이므로 if문을 통해 조건 판별한다.

5. 점수마저 같은 경우, 번호가 빠른 학생이 우선이므로 똑같이 if문을 통해 조건 판별한다.

 

import sys
#sys.stdin=open("input.txt","rt")
sum=0
minDis=float('inf')
N=int(input())
student=list(map(int,input().split()))
for x in student:
    sum+=x
avg=round(sum/N) #round(): 반올림함수

for i in range(N):
    dis = student[i]-avg
    if dis < 0:
        dis = -dis
    if dis < minDis:
        minDis = dis
        minStu = i
    elif dis == minDis:
        if student[i] > student[minStu]:
            minDis = dis
            minStu = i
        elif student[i]==student[minStu]:
            if i < minStu:
                minDis = dis
                minStu = i
print(avg, minStu+1)

 

 

 

강사님 풀이

 

import sys
sys.stdin=open("input.txt","rt")
n=int(input())
a=list(map(int, input().split()))
ave=int(sum(a)/n + 0.5) #sum(): 리스트 요소 모두 더함
min=2147000000 #대략 정수 최대값
for idx, x in enumerate(a): 
    tmp=abs(x-ave) #abs(): 절댓값 함수
    #평균과 가장 가까운 사람
    if tmp<min:
        min=tmp #차이
        score=x #점수
        res=idx+1 #학생번호
    elif tmp==min:
        #점수 높은 사람 and 학생번호 빠른 사람
        if x>score: # >=부등호를 사용했다면 학생번호 느린 사람을 구하게 됨
            score=x
            res=idx+1
print(ave, res)

 

 

 

배운 점

 

1. 파이썬의 round( )함수의 반올림은 정확히 반이라면 짝수쪽으로 간다.

   0.5일 때 올림하고 싶다면, 해당 숫자에 0.5를 더한 후 int 내장함수를 사용한다.

2. 최솟값을 초기화 할 때는 대략 정수의 최대값인 2147000000 으로 설정한다.

3. enumerate(리스트): 첫번째 인자에는 인덱스 번호를, 두번째 인자에는 값을 저장한다.

4. abs( ): 절대값 함수이다.