얄루몬 2022. 6. 29. 21:07

문제

  • n명의 학생 점수 list 평균 값과 평균 값에서 가장 가까운 대표값의 index를 구해라. (평균 값은 소수에서 반올림 해라.)
  • 단, 평균값과 가까운 값이 여러개 일 땐 더 큰 값을 대표값으로 해라.
  • 또한, 평균값과 가까운 대표값의 중복일 땐 더 앞에 있는 값의 index를 출력해라.

문제 풀이 1

  • 평균은 round( ) 함수와 sum( ) 함수를 사용해 구했다.
  • 최솟값을 구할 땐 최솟값과 비교하며 값을 교환해 저장할 변수를 최대로 큰 값을 넣어 작업한다.
    • arrMin = float('inf')
  • 최댓값을 구할 땐 최댓값과 비교하여 값을 교환해 저장할 변수를 최소로 작은 값을 넣어 큰 값이 들어오면 변경될 수 있게 작업한다.
    • 0을 기준으로 두고 작업해도 된다 
  • index를 받아야 하기에 enumerate를 사용해 풀어도 된다. (다른 방식도 있음)
  • 절대값을 씌운 값을 기준으로 min 값을 바꿔나간다.
  • 이때 min 값과 현재 점수의 tmp값이 같은 경우
      • 평균 74인데 73과 75의 절대값은 1로 동일하다.
    • 이 경우라면 더 큰 점수를 가져오기로 했으니 점수를 비교해 더 큰값으로 교체해준다. (73이었다면 75로 교체!)
    • 이때 점수도 같은 경우라면 영향이 없도록 부등호 표시에 같다 표시를 안 해주었다. 
  • 평균 값과 index 번호를 출력해준다. (이때 ind + 1로 시작한 이유는 간단하다. index = 0 부터 시작하는데 우리는 0부터 시작하는 인덱스 값이 아닌 1부터 시작하는 인덱스 값을 가져야 하기 때문이다.)
import sys
#sys.stdin = open("input.txt","rt")

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

ave = round(sum(a)/n)
min = 2147000000

for idx, nowScore in enumerate(a):
    tmp = abs(nowScore - ave)
    if tmp < min:
        min = tmp
        score = nowScore
        index = idx + 1
    elif tmp == min:
        if nowScore > score:
            score = nowScore
            index = idx+1
print(ave, index)

문제 풀이 2

import sys
#sys.stdin = open("input.txt","rt")

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

ave = round(sum(a)/n)
min = 2147000000

for i in a:
    tmp = abs(i - ave)
    if tmp < min:
        min = tmp
        score = i
    elif tmp == min:
        if i > score:
           score = i
print(ave, a.index(score)+1)
  • 위의 매커니즘과 같다 다만, enumerate가 아닌 list 자체를 돌며 해당 점수의 index를 가져오는 방식을 사용하였다.