백준 4344번 풀이

문제

이걸로 요약 쌉가능. 시험 점수의 평균을 내고, 그 평균 초과인 사람들의 비율을 계산해 소수점 아래 세 자리로 출력하면 된다. 선생님께서는 어디 계십니까? 저기 3시그마 바깥에 어디 있을걸요

풀이

import sys
a = int(sys.stdin.readline())
for i in range(a):
    caselist = sys.stdin.readline().split(" ")

역사와 전통의(?) sys.stdin.readline()을 또 우려먹을 수 있다. 대신 이번에는 입력받는 데이터가 데이터니만큼 리스트 업이 필요하다. 데이터에 대해서는 후술.

import sys
a = int(sys.stdin.readline())
for i in range(a):
    caselist = list(map(int,sys.stdin.readline().split(" ")))
    print(caselist[0],caselist[1:])

리스트를 왜 저따구로 뗐느냐… 입력 데이터가 이런 형식이다.

5 50 50 70 80 100

맨 앞의 숫자는 학생 수, 그 뒤에서부터 성적이다. 즉, 리스트로 입력받아서 앞에 부분을 떼야 한다.

import sys
a = int(sys.stdin.readline())
for i in range(a):
    caselist = list(map(int,sys.stdin.readline().split(" ")))
    mean=sum(caselist[1:])/caselist[0]
    print(mean)

일단 평균은 구했는데… 출력값은 저게 아니죠? 일단 차근차근 해 보면서 왜 저런 값이 도출되었는지 알아보자. 일단 첫번째 예시를 보면

5 50 50 70 80 100
# 입력
40.000%
# 결과값

입력을 바탕으로 평균을 도출하게 되면 70점이 나온다. 그리고 70보다 큰 값은 80과 100 두 개이므로 (2/5)*100 해서 40%.

import sys
a = int(sys.stdin.readline())
for i in range(a):
    casecount = 0
    caselist = list(map(int,sys.stdin.readline().split(" ")))
    scorelist= caselist[1:]
    mean = sum(caselist[1:])/caselist[0]
    for j in range(len(scorelist)):
        print(scorelist[j])
        if scorelist[j] > mean:
            casecount += 1
        else: 
            casecount += 0
    print(casecount)

일단… 리스트 인덱싱이 이상하게 돼서 점수부분만 따로 뺐다. 해당 코드는 조건이 맞으면 count가 올라가게만 해 둔 것.

import sys
a = int(sys.stdin.readline())
for i in range(a):
    casecount = 0
    caselist = list(map(int,sys.stdin.readline().split(" ")))
    scorelist= caselist[1:]
    mean = sum(caselist[1:])/caselist[0]
    for j in range(len(scorelist)):
        print(scorelist[j])
        if scorelist[j] > mean:
            casecount += 1
        else: 
            casecount += 0
    print((casecount/len(scorelist))*100)

여기까지 하면 결과값은 도출된건데… 출력 형식이 좀… 그렇다?

print(round((casecount/len(scorelist)),3)*100,"%")

어? 그럼 round 주면 되겠다! 안된다. 소수점 아래로 4자리 이상이면 반올림이 되지만, 3자리 미만인 애들에게 0을 붙여주지는 않는다.

print("%3f"%(casecount/len(scorelist))*100,"%")
0.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.4000000.400000 %

(마른세수) 너 나한테 왜그래…

import sys
a = int(sys.stdin.readline())
for i in range(a):
    casecount = 0
    caselist = list(map(int,sys.stdin.readline().split(" ")))
    scorelist= caselist[1:]
    mean = sum(caselist[1:])/caselist[0]
    for j in range(len(scorelist)):
        if scorelist[j] > mean:
            casecount += 1
        else: 
            casecount += 0
        case_percentage=(casecount/len(scorelist))*100
    print("%.3f"%case_percentage,"%")

이거 이렇게 내면 틀린다. 응? 뭐야 왜틀려요? 저거 case_percentage 변수가 한 칸 안으로 들어갔는데, 이게 이렇게 되면 for문 돌때마다 계속 저게 돌아가게 된다. 두번째 for문 안에 있는거거든… 그럼 저게 추가될때마다 매번 계산할 거 아뉴.

import sys
a = int(sys.stdin.readline())
for i in range(a):
    casecount = 0
    caselist = list(map(int,sys.stdin.readline().split(" ")))
    scorelist= caselist[1:]
    mean = sum(caselist[1:])/caselist[0]
    for j in range(len(scorelist)):
        if scorelist[j] > mean:
            casecount += 1
        else: 
            casecount += 0
    case_percentage=(casecount/len(scorelist))*100
    print(f'{case_percentage:.3f}%')

그래서 해당 변수를 밖으로 빼야 한다. (형식은 아마 위에꺼 써도 맞을듯)