[알고리즘] 1546 평균

DongGyu Jung·2022년 1월 16일
0
post-thumbnail

게시물을 작성하면서 복습하는 문제를 선정하는 기준은<solved.ac 티어 브론즈 1 (Bronze1) 이상>입니다.

※ 본 사진과 해당 게시글 내용의 문제 모두 백준 : 온라인 저지[Baekjoon_OnlineJudge]사이트에서 발췌해왔습니다.

❓ 문제

<문제>
세준이는 기말고사를 망쳤다. 
세준이는 점수를 조작해서 집에 가져가기로 했다. 
일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 
그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

예를 들어, 
세준이의 최고점이 70이고, 수학점수가 50이었으면 
수학점수는 50/70*100이 되어 71.43점이 된다.

세준이의 성적을 위의 방법대로 새로 계산했을 때, 
새로운 평균을 구하는 프로그램을 작성하시오.


<입력>
첫째 줄에 
시험 본 과목의 개수 N이 주어진다. 
(이 값은 1000보다 작거나 같다.)

둘째 줄에 
세준이의 현재 성적이 주어진다. 
(이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.)


<출력>
첫째 줄에 새로운 평균을 출력한다. 
실제 정답과 출력값의 절대오차 또는 상대오차가 10^-2 이하이면 정답이다.

[Input]			|    [Output]
3			|	75.0
40 80 60		|

3			|	66.666667
10 20 30		|

4			|	75.25
1 100 100 100		|

5			|	38.75
1 2 4 8 16		|

2			|	65.0
3 10			|
	
4			|	32.5
10 20 0 100		|

1			|	100.0
50			|

9			|	55.55555555555556
10 20 30 40 50 60 70 80 90

❗ 풀이

My Code

메모리 : 29200 KB
시간 : 80 ms

n = int(input())
s = [int(i) for i in input().split()] # 입렵받은걸 계산하기 편하게끔 리스트에
new_s = [k/max(s)*100 for k in s] # 각각 계산한 값을 새로운 리스트에

print(sum(new_s)/n) # new_s의 합에 처음 입력받은 과목 수 나눠서 평균 새로 구하기

(*프로그래머스 유저를 비하하는 것이 아님을 밝힙니다..저도 프로그래머스 애용자입니다.. )
프로그래머스에서 사용하던 버릇이 남아있어서인지
리스트 컴프리헨션으로 숏코딩을 하고싶어하는 욕구가 뿜뿜해서인지
무척 짧은 코드가 나오게 되었다....

최댓값을 가져오는 것은 max()함수를 사용했고
출력문에서 최종 연산을 수행하게끔해서 코드를 최대한 짧게 작성해보았다.


❣ 다른 풀이

(1)

# 입력받을 점수값 배열 대상 클래식한 방법으로 최댓값 찾는 함수 별도 선언 
def find_max(ary):
    max = ary[0]
    for i in range(1, len(ary)):
        if ary[i] > max:
            max = ary[i]

    return max
 
 
N = int(input())
ary = list(map(int, input().split()))

#시험 점수 중 최댓값 구하기
max = find_max(ary)

#새로운 평균 구하기
sum = 0
for i in range(N):
    sum = sum + ary[i]
avg = (sum / N) * 100 / max

print(avg)

이것이 상당히 FM스러운 방법인 것 같다.
(이것 또한..절대 비하의 뜻은 없다... 정석 좋아한다.. 수학의 정석으로 국도 끓여먹을 자신 있다.)
배열 요소 순차 비교로 정석대로 최댓값을 찾아내고

메인 연산에서 함수로 사용한 방법이고
이 부분 말고는 일반적인 평균 구하는 식의 모습이다.

0개의 댓글