뻠삥

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

 

4344번: 평균은 넘겠지

문제 대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다. 입력 첫째 줄에는 테스트 케이스의 개수 C가 주어진다. 둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다. 출력 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자

www.acmicpc.net

 

학생들의 점수가 평균치가 넘는 비율을 계산하는 문제입니다.

인풋값을 배열 또는 리스트로 입력받으면 쉽게 접근할 수 있습니다.

문제 풀이는 아래와 같습니다.

 

1. Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int cntLoop = Integer.parseInt(br.readLine());
        for (int i = 0; i < cntLoop; i++) {
            String[] arrStr = br.readLine().split(" "-1);
            int cntStudents = Integer.parseInt(arrStr[0]);
            int sumScore = 0;
            for (int j = 1; j < cntStudents + 1; j++) {
                sumScore += Integer.parseInt(arrStr[j]);
            }
            
            float avgScore = (float) sumScore / cntStudents;
            int high = 0;
            for (int j = 1; j < cntStudents + 1; j++) {
                if (Integer.parseInt(arrStr[j]) > avgScore)
                    high++;
            }
            
            bw.write(String.format("%.3f", ((float) high / cntStudents) * 100+ "%\n");
        }
        
        bw.close();
        br.close();
    }
}
 
cs

 

2. Python 3

1
2
3
4
5
6
7
8
9
10
11
import sys
 
if __name__ == '__main__':
    for i in range(int(sys.stdin.readline())):
        listCase = list(map(int, sys.stdin.readline().strip().split(' '-1)))
        avg = sum(listCase[1:]) / listCase[0]
        high = 0
        for j in listCase[1:]:
            if j > avg:
                high += 1
        print('%.3f' % ((high / listCase[0]) * 100+ '%')
cs

 

아래는 for문과 if문을 한 줄로 쓰는 코딩법을 연습하기 위해 작성해본 코드입니다.

작업 시간은 약간 줄어들었지만 list를 한 번 더 사용하는거라.. 효율은 잘 모르겠습니다.

1
2
3
4
5
6
7
import sys
 
if __name__ == '__main__':
    for i in range(int(sys.stdin.readline())):
        listCase = list(map(int, sys.stdin.readline().strip().split(' '-1)))
        avg = sum(listCase[1:]) / listCase[0]
        print('%.3f' % ((sum(list(1 for j in listCase[1:] if j > avg)) / listCase[0]) * 100+ '%')
cs