Study/백준코테

2. 백준 코딩테스트 4344번 문제 python

코딩 잘 할거얌:) 2021. 9. 13. 21:03
반응형

이번에 푼 문제는 백준 코딩 테스트 4344번 문제, '평균은 넘겠지'이다. 정답 비율이 낮아서 푼 문제인데 생각보다 그렇게 어렵진 않았다. 나도 오답이 한 번 떴었는데, 소수점 때문에 오답이 났었다.

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

 

4344번: 평균은 넘겠지

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

www.acmicpc.net

문제 유형은 리스트에 관련된 문제이다.

def i_can_over_mean():

    #테스트하는 숫자를 받는다.
    test_count = int(input())
    
    #테스트 결괏값을 저장하는 리스트이다.
    result_arr = []
    
    #테스트 횟수를 range를 통해 반복한다.
    for i in range(0,test_count):
    
        #스페이스바로 나누어져 있는 입력값을 리스트 형태로 받는다.
        receive_input_arr = input().split()
        
        #테스트마다 평균값을 받아야 하는 변수 선언
        current_mean = 0
        
        #각 테스트마다 점수를 몇개 입력하는 지 저장하는 변수 선언
        current_receive_score_count = int(receive_input_arr[0])
        
        #맨 앞의 리스트 삭제하여 코드를 좀 더 깔끔하게 다듬을 수 있게 한다.
        del receive_input_arr[0]
        
        #점수 리스트에서 평균을 구한다.
        for j in receive_input_arr:
            current_mean += int(j)
        current_mean = current_mean/current_receive_score_count
        
        #평균보다 넘는 점수를 카운팅하는 변수 선언
        mean_over_count = 0
        
        #점수 리스트에서 평균 넘는 점수를 비교하여 카운팅한다.
        for j in receive_input_arr:
            if current_mean < int(j):
                mean_over_count += 1
                
        #카운팅한 것을 백분위로 나타내어 결괏값을 저장한다.
        result_arr.append(format(mean_over_count/current_receive_score_count*100,".3f"))
        
    #결괏값 출력
    for i in result_arr:
        print(f"{i}%")

if __name__ == "__main__":
    i_can_over_mean()

 

내가 오답이 난 이유는 백분위에서 소수점 3번째자리까지 반올림을 해야 했는데, 그걸 round로 표현해서 오답이 발생하였다. round로 표현하니 소수점 끝자리 표현에서 문제가 발생한다. 예를 들어 소수점이 50.000으로 0으로 끝이 나면 round는 50.0으로 3자리 설정을 하더라도 한 자리만 표현하게 된다.

그래서 round대신, format을 이용해서 소수점을 표현하니 모두 표시가 되어 정답이 되었다. 아무래도 소수점 자리 때문에 오답이 많이 난 문제가 아닐까 한다.

 

round(50.000,3) #결과 : 50.0
format(50.000,".3f") #결과 : 50.000

 

코드가 꽤나 길다. 하지만 파이썬에 내장되어있는 함수를 사용하지 않아서 길어진 것도 있다. 그렇다고 성능 차이가 있진 않아서 이대로 마무리하기로 했다. 하지만 유난히 짧은 코드는 읽어보고 파이썬에 내장된 함수를 익히기 위해 찾아봤다.

 

python3옆에 수정이라고 적힌 것이 내가 제출한 것인데, 메모리와 실행속도 차이가 크게 나지 않는다.

 

코드 길이가 214B로 짧은 편에 속하는 코드

 

num = int(input())

for i in range(num):
  sco = list(map(int, input().split()))
  avg = sum(sco[1:])/sco[0]
  cnt = 0
  for j in sco[1:]:
    if j > avg:
      cnt += 1
  print("%.3f%%" % round(cnt/sco[0]*100, 3))

 

 

728x90