BOJ 1546 - 평균 (Python3)

2022. 11. 22. 01:28Bronze/Bronze I

상당히 어려워 보이지만 풀이과정이 간단할 수 있는 문제가 있다.

이건 상당히 어렵지만 방법론만 깨닫는다면 아주 쉬워지는 26008번 문제 같은 부류를 말하는 것이 아니다.

실제로 쉽고, 발상을 깨닫기도 어렵지는 않지만 직접 구현하는 데에서 어떤 방식으로 접근하느냐가 풀이과정의 간단함에 영향을 끼친다.

 

그럼 본격적으로 풀이에 돌입해 보자.


문제

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

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

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

 

입력

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

 

예제 입력)

# 예제 입력 1
3
40 80 60

# 예제 입력 2
3
10 20 30

# 예제 입력 3
4
1 100 100 100

# 예제 입력 4
5
1 2 4 8 16

# 예제 입력 5
2
3 10

# 예제 입력 6
4
10 20 0 100

# 예제 입력 7
1
50

# 예제 입력 8
9
10 20 30 40 50 60 70 80 90

 

출력

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

 

예제 출력)

# 예제 출력 1
75.0

# 예제 출력 2
66.666667

# 예제 출력 3
75.25

# 예제 출력 4
38.75

# 예제 출력 5
65.0

# 예제 출력 6
32.5

# 예제 출력 7
100.0

# 예제 출력 8
55.55555555555556

 


내 코드

n, l = int(input()), []
for i in input().split() : l.append(int(i))
print(sum(l)/max(l)*100/n)

 

이 코드는 첫날인가 둘째날인가 푼 문제라 map도 모르는 상태에서 작성했다. 엉망진창이라면 제대로 본 것이다.

 

평균을 어떻게 구하는지는 당연히 알고 있을 것이다.

그렇다면 모든 값이 일괄적으로 p배가 된다면? 평균도 당연히 p배가 되어야만 하지 않겠는가?

l을 성적이 저장된 배열이라고 하면 평균은 당연히 sum(l)/n이 되어야만 할 것이다. 그리고 모든 수에 곱해지는 인자는 100/max(l)이 될 터.

이 둘을 곱한 다음 제출하면 끝이다!

 

이로서 1546번의 풀이를 마친다.

그럼, 오늘도 당신의 코딩 실력이 상승하기를.

 

728x90