본문 바로가기
코딩테스트/Algorithm

[Algorithm][Python] 대표값

by codeok 2021. 5. 13.
반응형

[문제]  K번째 큰 수

N명의 학생의 수학성적이 주어집니다. N명의 학생들의 평균(소수 첫째자리 반올림)을 구하고, 


N명의 학생 중 평균에 가장 가까운 학생은 몇 번째 학생인지 출력하는 프로그램을 작성하세
요.


답이 2개일 경우 성적이 높은 학생의 번호를 출력하세요. 만약 답이 되는 점수가 여러 개일 
경우 번호가 빠른 학생의 번호를 답으로 한다

 

입력 설명

첫줄에 자연수 N(5<=N<=100)이 주어지고, 두 번째 줄에는 N개의 자연수가 주어진다.
학생의 번호는 앞에서부터 1로 시작해서 N까지이다.

 

출력 설명

첫줄에 평균과 평균에 가장 가까운 학생의 번호를 출력한다.
평균은 소수 첫째 자리에서 반올림합니다.

 

입력예제 1

10
65 73 66 87 92 67 55 79 75 80

 

출력예제 1

74 9

 

문제 접근

  1. N과 N의 갯수만큼의 값들을 student 배열에 담는다. (각 학생의 평균값의 - 학생값)을 비교할 min 변수를 설정해준다. 
  2. student 배열을 통해서 평균을 구한다.
  3. student를 for문을 enumerate로 idx와 각 학생의 값을 돌려서 평균값과 각 학생의 차이의 절댓값을 구한다.
  4. if 절댓값이 있는 tmp가 min보다 적다면 score에 각 학생의 값을 넣고, res 변수에 idx + 1해서 넣어준다.
  5. elif tmp가 min과 같고 if 이전 평균에 가까운 값이 현재 값보다 크다면 score와 res에 점수와 인덱스를 치환해준다.

 

풀이

 

나의 코드

  • 8행 : round는 round_half_even 방식이다. 이름부터 even이여서 짝수를 따라갈것 같습니다.
    • a = 4.500
    • round(a) 하면 첫째 자리에서 부터 올림이기에 5가 나올 거라고 생각하지만, 4가 나옵니다.
    • round_half_up방식을 사용하기 위해서 8행과 같이 0.5를 더해서 int()으로 변환해줍니다.
N = int(input())
student = list(map(int, input().split()))
# round는 round_half_even 방식을 택한다.
# a = 4.500 |  print(round(a)) 
# 하프지점에 있으면 짝수지점으로 올라간다. 즉, 답이 5가 아니라 4가 나온다.
# avg = round(sum(student) / N) # 학생들의 평균, round()로 소숫점 1자리에서 올림
# round를 사용하지 않고 0.5를 더해서 int()형 변환해서 해결
avg = int(sum(student) / N + 0.5)
min = 21470000

for idx, x in enumerate(student):
    tmp = abs(x - avg) # 평균값과 각 학생의 차이

    if tmp < min:
        min = tmp
        score = x
        res = idx + 1
    elif tmp == min:
        if x > score:
            score = x
            res = idx + 1

print(avg, res)
반응형