Home [Python] 백준 4344번 : 평균은 넘겠지
Post
Cancel

[Python] 백준 4344번 : 평균은 넘겠지

Problem

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

Solution

오답코드

1
2
3
4
5
6
7
8
9
10
11
12
13
c = int(input())

for i in range(c):
    a = list(map(int,input().split()))
    n = a[0]
    del a[0] # 학생의 수 리스트에서 제거
    a.sort() # 오름차순으로 정렬
    avg = sum(a)/n

    for j in range(n):
        if a[j]>avg: # 평균보다 높은 경우
            print('%.3f%%' %((n-j)/n*100)) # 학생의 비율 출력
            break

처음에 작성한 코드이다. 내가 구현한 방식은 다음과 같다. 우선 한 줄을 통째로 리스트로 받는다. 그 후 0번째 인덱스의 요소를 변수에 저장 후 리스트에서 제거한다. 이렇게 해서 성적만 남게 된 리스트를 오름차순 정렬한 후 평균과 비교하며 큰 값이 존재하면 해당 요소를 포함한 뒤의 값들을 세어 비율을 출력하는 방식이다. 하지만 이러한 방식으로 짠 코드에 예제 input을 입력했을 때 모두 정상 출력되었고 육안으로 크게 문제될 만한 부분이 없다고 생각했는데도 4번이나 오답처리가 됐다.

결국 질문게시판에 질문을 올린 후에야 문제점을 찾을 수 있었다. 평균을 넘는 학생이 한명도 없는 경우(모든 학생들의 점수가 같은 경우)에는 0.000%를 출력해야 하지만 내 코드에서는 아무런 출력도 없었다. 내 코드는 평균보다 높은 학생이 최소 한명은 존재한다는 가정이 들어간 코드였기 때문이다.

정답코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
c = int(input())

for i in range(c):
    a = list(map(int,input().split()))
    n = a[0]
    del a[0] # 학생의 수 리스트에서 제거
    a.sort() # 오름차순으로 정렬
    avg = sum(a)/n

    for j in range(n):
        if a[j]>avg: # 평균보다 높은 경우
            print('%.3f%%' %((n-j)/n*100)) # 학생의 비율 출력
            break
        elif j==n-1: # 평균보다 높은 학생이 없는 경우
            print("0.000%")

Memo

위의 문제를 해결하기 위한 가장 명확한 방법은 학생의 수를 새로운 변수를 통해 카운트한 후 for문이 종료되는 시점에 print하는 것이지만 빠른 수정을 위해 for문에 elif문을 사용하여 예외처리를 하는 방법으로 해결하였다.

This post is licensed under CC BY 4.0 by the author.

[Python] 백준 10951번 : A+B - 4

[Python] 백준 1065번 : 한수