[Softeer]성적 평균 파이썬 풀이
Softeer 성적 평균¶
문제 page: https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=584
구간별 평균을 구하는 문제
- slicing을 이용하여 구간에 속하는 원소합을 구한다.
- index의 길이로 나눈다.
- 소수셋째자리에서 반올림한다 (round함수 이용)
In [1]:
# naive version (469ms, memory: 117.89Mb)
N, K = [int(x) for x in input().split()]
scores = [int(score) for score in input().split()]
result = []
for _ in range(K):
A_i, B_i = [int(x) for x in input().split()]
A_i -= 1
B_i -= 1
average = sum(scores[A_i:B_i+1])/(B_i-A_i+1)
average = round(average, 2)
result.append(average)
for average in result:
print('%.2f'%average)
5 3 10 50 20 70 100 1 3 3 4 1 5 26.67 45.00 50.00
구간 합 (Bonus)¶
별도의 list를 만들어 score를 누적해서 더할경우 반복문의 사용이 줄어들어 빠르게 구간 합을 구할 수 있다.
누적합[0] = 0
누적합[1] = 0 + score[0]
누적합[2] = 0 + score[0] + score[1]
...
누적합[n] = 0 + score[0] + score[1] + ... + score[n-1]
score[i-1] + score[i+1] + ... + score[i+j-1] = 누적합[i+j] - 누적합[i-1]
참고: 동빈나 파이썬 알고리즘(구간 합 빠르게 구하기)
https://www.youtube.com/watch?v=cswJ1h-How0&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=9
In [3]:
# speed up version (331ms, memory: 141.04Mb)
N, K = [int(x) for x in input().split()]
accumulate_score = 0
acc_array =[0]
for score in input().split():
accumulate_score += int(score)
acc_array.append(accumulate_score)
result=[]
for _ in range(K):
A_i, B_i = [int(x) for x in input().split()]
denom = B_i - A_i + 1 # denominator: 분모
num = acc_array[B_i] - acc_array[A_i-1] # numerator: 분자
average = round(num/denom, 2)
result.append(average)
for average in result:
print('%.2f'%average)
5 3 10 50 20 70 100 1 3 3 4 1 5 26.67 45.00 50.00