본문 바로가기
알고리즘

Algorithm - 대표값

by DGK 2021. 11. 1.

 

알고리즘 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

문제

[대표값 구하기]

 

N명 학생의 수학점수가 주어집니다. N명 학생들의 평균(소수 첫째자리에서 반올림)을 구하고, N명의 학생 중 평균에 가장 가까운 학생은 몇 번째 학생인지 출력하는 프로그램을 작성하시오.

 

단, 평균과 가장 가까운 점수가 여러 개일 경우 점수가 가장 높은 학생의 번호를 답으로 하고, 높은 점수를 가진 학생이 여러 명일 경우 학생번호가 가장 빠른 학생의 번호를 답으로 한다.

 

 

*입력 설명

첫 번째 줄에는 자연수 N(5 ≤ N ≤ 100)이 주어진다.

두 번째 줄에는 각 학생의 수학점수인 N개의 자연수가 주어진다.

참고로, 학생의 번호는 1부터 시작해서 N까지이다.

 

*출력 설명

첫 번째 줄에 평균과 평균에 가장 가까운 학생의 번호를 출력한다.

참고로, 평균은 소수 첫째 자리에서 반올림한다.

 

 


 

 

풀이(Python)

답안

import sys
sys.stdin = open('AA/input_4.txt', 'rt')

n = int(input())
a = list(map(int, input().split()))
min = 2147000000

ave = int(sum(a)/n + 0.5)
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)

# 출력 : 74 7

 

input_4.txt(입력)

10
45 73 66 87 92 67 75 79 75 80

 

 

중요내용

  1. enumerate() 함수를 사용해서 리스트의 인덱스 번호와 해당 데이터를 함께 반환한다.
  2. min = 2147000000의 코드는 변수 min에 파이썬에서 충분히 큰 정수형 숫자를 선언한 것이다.
  3. elif문 안의 if문 조건 x > score 코드를 보면, 이 때 x는 for문이 돌면서 새롭게 들어온 값이고 score는 바로 직전에 할당된 값이다.
  4. 또한, if문의 조건을 x > score로 작성해야만, 동일한 점수일 경우 학생번호가 가장 빠른 학생의 점수가 선택된다.
  5. 만약, if문의 조건을 x >= score로 작성하면, 동일한 점수일 경우 학생번호가 가장 느린 학생의 점수가 선택된다.
  6. ave = int(sum(a)/n + 0.5)의 코드는 소수 첫째자리에서 반올림을 하는 방식(half_up)을 구현한 것이다.

 

 

참고(1)

a = 66.6
a = a + 0.5
a = int(a)

print(a)

# 결과 : 67


b = 66.4
b = b + 0.5
b = int(b)

print(b)

# 결과 : 66

 

우리가 알고 있는 일반적인 반올림 방식(half_up)을 구현한 코드이다. [4이하는 버리고, 5이상은 올리는 방식]

 

 

참고(2)

a = 4.500
print(round(a))

# 결과 : 4


b = 5.500
print(round(b))

# 결과 : 6

 

round() 함수는 일반적인 반올림 방식(half_up)이 아닌, round_half_even 방식으로 해당 값을 리턴한다.

즉, round() 함수는 정확히 0.500을 만나면 짝수 방향으로 근사 값을 리턴한다.

따라서, 4.500을 round() 함수에 넣으면 5가 아닌 4가 리턴되는 것이다.

만약, 4.501을 round() 함수에 넣으면 5가 리턴된다.(0.500보다 조금이라도 큰 수는 올림 처리를 함)

 

이러한 이유로 알고리즘 답안에서 round() 함수를 사용하지 않고, 해당 숫자에 0.5를 더한 후 int() 함수를 사용한 것이다. (ex. ave = int(sum(a)/n + 0.5))

 

'알고리즘' 카테고리의 다른 글

Algorithm - 자릿수의 합  (0) 2021.11.02
Algorithm - 정다면체  (0) 2021.11.02
Algorithm - 최소값 구하기  (0) 2021.10.29
Algorithm - K번째 큰 수  (0) 2021.10.29
Algorithm - K번째 수  (0) 2021.10.25

댓글