백준 4344번 평균은 넘겠지
문제
첫 줄에 테스트 케이스 수 C가 주어진다. 각 케이스는 학생 수 N(1 이상 1000 이하)과 N명의 점수(0 이상 100 이하의 정수)로 이루어진다. 케이스마다 평균을 넘는 학생의 비율을 반올림하여 소수점 셋째 자리까지 %와 함께 출력한다. 예를 들어 5 50 50 70 80 100이면 평균은 70이고 평균을 넘는 학생이 2명이므로 40.000%다.
풀이
앞서 푼 OX퀴즈 문제와 비슷한 구조다. 케이스 수만큼 바깥 반복문을 돌리고, 안에서 list(map(int, input().split()))으로 한 줄을 정수 리스트로 만든다. 리스트의 첫 값은 학생 수이므로 점수는 score[1:]부터 쓴다.
점수의 평균을 avgsum에 구한 뒤, 안쪽 반복문에서 평균보다 높은 점수를 만날 때마다 cnt를 올린다. 마지막에 cnt / score[0] * 100으로 비율을 구해 출력한다.
##### float 사용하는데, 소수점 셋째 자리까지 출력하는 방법을 생각해봐야 한다.
N = int(input())
for i in range(N):
score = list(map(int, input().split()))
avgsum = sum(score[1:]) / len(score[1:])
cnt = 0
#
for i in score[1:]:
# float 인 avgsum 과 list인 score[1:]을 비교할 방법.
if i > avgsum:
cnt += 1
# else:
# cnt = 1
rate = cnt / score[0] * 100
print(f'{rate:.3f}%')처음에는 else와 반복문을 하나 더 넣어 풀어 보려 했지만 원하는 출력이 나오지 않았다. 소수점 셋째 자리까지 출력하는 방법이 가장 막혔던 부분이고, f-string 으로 해결했다.
짚고 갈 점
f-string 은 문자열 따옴표 앞에 f를 붙이고, 문자열 안의 중괄호에 변수나 계산식을 넣어 값을 끼워 넣는 문법이다. 중괄호 안에서는 콜론 뒤에 서식 지정자를 쓴다.
- 문자열은
s, 정수는d, 실수는f를 쓴다. {rate:.3f}는 실수rate를 소수점 셋째 자리까지 반올림해 출력한다. 점(.)과 자릿수를 빼고3f로 쓰면 자릿수 지정이 되지 않는다.- 뒤에 붙은
%는 서식과 무관하게 그대로 출력되는 문자다.
바깥 반복문과 안쪽 반복문이 같은 이름 i를 쓰지만, 바깥 i는 반복 횟수를 세는 데만 쓰여 결과에는 영향이 없다.