import sys C = int(input()) #테스트 케이스 개수 입력 for _ in range(C): #학생수와 각 학생의 점수를 입력받아서 리스트로 변환 score = list(map(int,sys.stdin.readline().split())) #리스트의 1번째 인덱스부터 마지막까지(각 학생의 점수) 0번째 인덱스(학생 수)로 나눠서 평균을 저장 avg = sum(score[1:])/(score[0]) cnt = 0 #평균이 넘는 학생을 카운트 #리스트의 1번째 인덱스부터 마지막까지 i가 순회(score[1:] : indexing) for i in score[1:]: if score[i]>avg: cnt+=1 #평균이 넘는 학생 카운트 #포멧팅(formating)으로 소수점아래 3자리까지 출력 print("{0:.3f}%".format(cnt/score[0]*100))
score
리스트에 예제 입력에서 보이는대로 학생 수와 각 학생의 점수를 입력하여 리스트화해서 저장한다.
그 다음 평균을 구해서 평균보다 점수가 높은 학생의 수를 구한다.
마지막으로 그 비율을 구해서 출력하면 된다.
어려운 문제는 아니지만 포멧팅의 개념을 잠깐 설명하자면
f-string과 비슷하게 보면 된다.
f-string의 사용법은 아래와 같고,
>>> a = 94
>>> print(f"apple = {a}")
apple = 94
포멧팅의 사용법은 아래와 같다.
a = 15.3356
>>> print("apple = {0:.3f}".format(a))
apple = 15.336
f-string은 다른 문제에서 설명한 적이 있어서 나의 velog에서 'f-string'을 검색해서 찾아보길 바란다.
포멧팅은 print("{0:.3f}".format(variable))
이런식으로 사용하면 된다.
물론 format
함수 안에 들어가는 변수는 String형만 아니면 되는 것 같다.(int, float, boolean다 오류없이 잘 된다. list, tuple같은 컨테이너 변수도 TypeError가 난다.)
여기서 0
은 인덱스 번호이다.
>>> a = 1.555
>>> b = 2.555
>>> print("{0:.3f}".format(a,b))
1.555
>>> print("{1:.3f}".format(a,b))
2.555
0
일 경우 a
(1.555)가 출력되고 1
일 경우 b
(2.555)가 출력된다.
또 .3f
는 소수점 아래 3번째 자리까지 표현하라는 의미이다. 소수점 아래 4번째 자리에서 자동으로 반올림된다.
#include <iostream> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int T; cin >> T; cout << fixed; cout.precision(3); while (T--) { int N; int sum = 0; cin >> N; int *arr = new int[N]; for (int i = 0; i < N; i++) { cin >> arr[i]; sum += arr[i]; } int cnt = 0; for (int i = 0; i < N; i++) { if (arr[i] > (sum / (float)N)) cnt++; } cout << (float)cnt / (float)N * (float)100 << "%" << '\n'; } }
int *arr = new int[N]
은 배열의 동적 할당이다. 원래 배열(Array)는 정적이기 때문에 정해진 메모리만 사용할 수 있는데 동적 할당을 통하여 더 유동적으로 메모리를 사용할 수 있다. 이 부분에 대해서는 나중에 자세히 설명하겠다.