얄루몬
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를 가져오는 방식을 사용하였다.