본문 바로가기
  • 초부득3 - 어제보다 나은 내일을 위해
  • 꿈이 현실이 되는 날까지
sw사관학교 정글 2기/01 기초,재귀,완전탐색, 정렬

[기초-배열] ★백준 4344번 평균은 넘겠지 with Python3

by 금의야행 2021. 8. 7.

https://www.acmicpc.net/problem/4344

 

4344번: 평균은 넘겠지

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

www.acmicpc.net

문제

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

내 풀이

n = int(input())
for _ in range(n):
    a = list(map(int, input().split()))
    tests = a[1:]
    mean = sum(tests)/len(tests)

    #i = 0 여전히 i가 0에서 시작하지 않으면 어쩌지 걱정이 많았다.
    d = []
    for i in range(len(tests)):
        if tests[i] > mean:
            d.append(tests[i])
    e = len(d) / a[0]
    f = (round(e*100, 3))
    print(format(f, ".3f")+"%")

해설

소수를 원하는대로 표시하는데에 골먹은 문제. 

round() 함수로 소수점 3자리 이하를 반올림해줬다.

하지만 그걸론 소수점이 충분히 안생기는 ex)40.0% 등을 강제로 format()의 ".3f"로 바꿔주었다.

 

list[1:]도 아주 중요 포인트. 궁금하면 500원.

 

근데 나는 너무 문제 풀이에 리스트위주로 하는것같다. 프린트시 파악하기 쉽다는 장점이 있지만, 덜 수학적이라는 문제가 있다.

정답 풀이

n = int(input())

for _ in range(n):
    nums = list(map(int, input().split()))
    avg = sum(nums[1:])/nums[0]  # 평균을 구함 (nums[0]: 학생수, nums[1:] 점수)
    cnt = 0
    for score in nums[1:]:
        if score > avg:
            cnt += 1  # 평균 이상인 학생 수
    rate = cnt/nums[0] *100
    print(f'{rate:.3f}%')

출처:https://ooyoung.tistory.com/62

 

해석

나는 주어진 학생수를 활용 안했다. 주어진 입력값을 잘 활용하자@!

 

다시 나온 for score in num[1:] . score변수를 따로 선언하지 않고 바로 num[1:]이라는 list를 활용할 수 있다는게 정말 좋다. 

count를 사용하면 len같은것보다 시간복잡도 면 같은 측면에서 더욱 효율적인것 같다. 

댓글