본문 바로가기

백앤드 개발/코딩테스트

[파이썬 문제 풀이] 대표값

1. 문제

# N명의 학생 점수가 주어짐
# 학생의 평균 (소수 첫째자리 반올림) 을 구하고
# N명의 학생 중 평균에 가장 가까운 학생은 몇번째 학생인지 출력

# 평균과 가장 가까운 점수가 여러개일 경우 높은 학생의 번호 출력
# 평균과 가까운 점수가 여러개 인 경우 점수가 높은 학생을 출력
# 높은 점수를 가진 학생이 여러 명일 경우 학생 번호 빠른 학생 점수를을 출력

 

2. 풀이

# 방법1
import sys
# sys.stdin=open("input.txt", "r")

n = int(input()) # 첫줄엔 학생 수 n (5~100) 이 주어짐
ls = list(map(int, input().split())) # 두번째 줄엔 각 학생의 수학점수가 주어짐

avg = round(sum(ls)/len(ls)) # 점수 평균
dif = abs(avg-ls[0]) # 점수차이 절대값
score = ls[0] # 학생 점수
stu_number = 1 # 학생 번호

for i in range(1, n):
    if dif > abs(avg-ls[i]): # 차이가 더 작으면 해당값을 출력
        dif = abs(avg-ls[i])
        score = ls[i]
        stu_number = i+1

    elif dif == abs(avg-ls[i]): # 차이가 같다면
        if score < ls[i]: # 점수가 더 높은 학생 출력
            score = ls[i]
            stu_number = i+1

# 높은 점수를 가진 학생일 경우 학생 번호가 빠른 학생 출력 (따로 구현할 필요 없음)

print(avg, stu_number)

 

 

# 방법 2
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)

3. 배운 내용

1) int(3.14): 3 반환. 정수 변환시 소수점 버림

2) round(3.14): 두번째 인자가 없으면 소수점 첫째자리에서 반올림. 3 반환

3) round(3.1415, 2) : 소수점 셋째 자리에서 반올림. 3.14 반환

4) round(31.41, -1): 1의 자리에서 반올림. 30 반환

5) for idx, x in enumerate(list): list 값의 인덱스와 값을 반환

6) 단, round() 함수는 반올림 하는 자리가 정확히 절반인 5일경우 내림하는 half even 방식

 

 

참조: https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8