문제
https://www.acmicpc.net/problem/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}%')
그래서 해당 변수를 밖으로 빼야 한다. (형식은 아마 위에꺼 써도 맞을듯)
'BOJ > [BOJ] Python' 카테고리의 다른 글
백준 1065번 풀이 (0) | 2022.08.18 |
---|---|
백준 15596번 풀이 (0) | 2022.08.18 |
백준 8958번 풀이 (0) | 2022.08.18 |
백준 1546번 풀이 (0) | 2022.08.18 |
백준 3052번 풀이 (0) | 2022.08.18 |