[알고리즘] 4344 평균은 넘겠지

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

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

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

❓ 문제

<문제>
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 
당신은 그들에게 슬픈 진실을 알려줘야 한다.

<입력>
첫째 줄에는 
테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 
각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 
이어서 N명의 점수가 주어진다. 
(점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.)


<출력>
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
[Input]
5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91

[Output]
40.000%
57.143%
33.333%
66.667%
55.556%

❗ 풀이

My Code

메모리 : 29200KB
시간 : 68ms

import sys
n = int(sys.stdin.readline())
for _ in range(n) :
    ls = list(map(int,sys.stdin.readline().split())) #map객체로는 연산이 안되기때문에 list()로 만들기
    avg = sum(ls[1:])/ls[0] # 평균값 구하기 _ 첫번째 (0) 값은 점수의 갯수이기 때문에 인덱스 1부터
    top = [s for s in ls[1:] if s > avg] # 평균보다 높은 친구들 점수만 뽑아오기
    print("{:.3f}%".format((len(top)/ls[0])*100)) #format함수로 자릿수 조정 출력

출력 (print())에서 사용한 포맷팅은 format()함수
해당 함수를 통해 중괄호 출력형식 지정에서 자릿수를 조정해주었다.

계산에서 다른 분들의 풀이와 조금 달랐던 부분은
필자는 리스트 컴프리헨션을 통해
내부에 조건문을 활용해서 평균을 넘는 점수만 가져왔던 것이다.

헷갈렸던 부분은
푸는 것이 아니라 문제에 있었는데
점수에 대한 비율이 아닌
평균을 넘는 학생들의 비율이라는 것이다.


❣ 다른 풀이

(1)

import sys

t = int(input())
for i in range(t):
    n_stu = []
    n_stu = list(map(int, sys.stdin.readline().rstrip().split()))
    average_score = sum(n_stu[1:]) / len(n_stu[1:])
    
    def compare(score):
        return score > average_score
    
    n_stu_test = list(map(compare, n_stu[1:]))
    
    print(f'{n_stu_test.count(True)/len(n_stu_test) * 100:.3f}%')

(1)풀이는 지역 함수를 별도로 선언해서 활용하는 모습이고
return값을 비교연산식으로 넣으면서 True/False Boolean값이 반환되게 하였다.
이를 활용해서
" True (평균보다 높은 값) 수 / 전체 시험점수 갯수 " 식을 작성했고
최하단 출력문에서 최종 연산을 진행하는 형태이다.

포맷팅은 f"{}"포맷팅을 사용하였고
~~:.3f 로 f포맷팅에서의 소숫점 조정을 해주었다,


(2)

num = int(input())

for _ in range(num):
    scores = list(map(int, input().split()))
    avg = sum(scores[1:])/scores[0]          # 평균~
    
    cnt = 0
    for i in scores[1:]:                     # 평균 넘은 점수 개수~
        if i > avg:
            cnt += 1
            
    per = (cnt/scores[0])*100                # 평균 넘은 개수 퍼센트~
    print('%.3f' %per + '%') 

사실 계산 방법 위 방법들과 다르지 않고
갯수를 cnt라는 변수에 별도로 세었다는 것이 차이라면 차이이다.

포맷팅은 %를 사용하였는데
이 포맷팅에서의 소숫점 조정은
"%.(자릿수)f"%(값)을 사용한다.
(자릿수를 작성한 후, 바로 뒤에 float를 뜻하는 f를 꼭 입력해주어야한다.

0개의 댓글