자기계발
백준
4344 · 평균은 넘겠지

백준 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는 반복 횟수를 세는 데만 쓰여 결과에는 영향이 없다.

출처