{ }codelper
평균P0225

반 평균과 학년 평균

한 학년에 반이 m개 있다. 첫 줄에 m이 주어진다. 다음 m줄에 반마다 그 반의 학생 수 k와 학생 k명의 점수가 빈칸으로 띄워 한 줄에 주어진다. 반마다 그 반의 평균 점수를 입력 차례대로 한 줄씩 출력하라. 마지막 줄에는 학년 평균을 출력하라. 학년 평균은 학년 모든 학생의 점수를 더한 값을 학년 전체 학생 수로 나눈 값이다. 평균은 모두 소수 셋째 자리에서 반올림해 소수점 아래 정확히 두 자리로 쓴다(85 → 85.00). 반올림이 헷갈리지 않도록, 출력할 모든 평균은 100을 곱했을 때 소수 부분이 0.4 이하이거나 0.6 이상이 되게 주어진다.

입력
1 ≤ m ≤ 100, 1 ≤ k ≤ 100, 0 ≤ 점수 ≤ 100(정수)
출력
m줄의 반 평균, 마지막 줄에 학년 평균(모두 소수 둘째 자리까지)
예시 1 · stdin
2
3 90 80 70
1 100
stdout
80.00
100.00
85.00
예시 2 · stdin
2
3 0 0 1
2 100 100
stdout
0.33
100.00
40.20
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

가장 큰 함정은 평균의 평균이에요.
반 평균들을 더해 반 수로 나누면, 반 크기가 다를 때 학년 평균과 달라요.
3명 반 평균 80과 1명 반 평균 100을 다시 평균 내면 90이지만, 학생 4명의 평균은 340 ÷ 4 = 85예요.
그래서 반마다 점수 합과 학생 수를 따로 모아 두었다가 마지막에 나눠요.
반 합계는 반마다 0에서 다시 시작해요.
둘째 함정은 정수 나눗셈이에요.
C·C++·Java·C#에서 s / k는 int끼리라 몫만 남아요.
(double)s / k(C++ static_cast<double>(s) / k)처럼 먼저 바꾸고 나눠요.
double avg = s / k;나 (double)(s / k)는 이미 소수가 버려진 뒤예요.
Python 3·JS·TS·크레이콘의 /는 늘 소수까지 나눠요.
소수 두 자리는 Python f"{x:.2f}", JS·TS x.toFixed(2), C printf("%.2f"), Java String.format(Locale.ROOT, "%.2f", x), C# x.ToString("F2", CultureInfo.InvariantCulture), 크레이콘 글자.소수자리맞추기(x, 2)예요.
C++은 std::fixed를 꼭 같이 써요.
std::setprecision(2)만 쓰면 소수 자리가 아니라 유효 숫자 두 개라서 33.33이 33으로 나와요.
한 줄에 학생 수와 점수가 함께 오니 Python은 k, *scores = map(int, line.split()), JS·TS는 const [k, ...scores] = …로 나눠 받으면 편해요.

Pythonmain.py · 11 줄
m = int(input())out = []total = count = 0for _ in range(m):    k, *scores = map(int, input().split())    s = sum(scores)    out.append(f"{s / k:.2f}")    total += s          # 학년 평균은 반 평균이 아니라 점수 합과 학생 수를 모아서 구한다    count += kout.append(f"{total / count:.2f}")print("\n".join(out))
JavaScriptmain.js · 15 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const m = Number(lines[0]);const out = [];let total = 0;let count = 0;for (let i = 1; i <= m; i++) {  const [k, ...scores] = lines[i].trim().split(/\s+/).map(Number);  let s = 0;  for (const x of scores) s += x;  out.push((s / k).toFixed(2));  total += s; // 학년 평균은 점수 합과 학생 수를 모아서 구한다  count += k;}out.push((total / count).toFixed(2));console.log(out.join("\n"));
TypeScriptmain.ts · 16 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const m: number = Number(lines[0]);const out: string[] = [];let total = 0;let count = 0;for (let i = 1; i <= m; i++) {  const [k, ...scores]: number[] = lines[i].trim().split(/\s+/).map(Number);  let s = 0;  for (const x of scores) s += x;  out.push((s / k).toFixed(2));  total += s; // 학년 평균은 점수 합과 학생 수를 모아서 구한다  count += k;}out.push((total / count).toFixed(2));console.log(out.join("\n"));
JavaMain.java · 26 줄
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Locale;import java.util.StringTokenizer; public class Main {    public static void main(String[] args) throws IOException {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        int m = Integer.parseInt(in.readLine().trim());        StringBuilder out = new StringBuilder();        int total = 0, count = 0;        for (int i = 0; i < m; i++) {            StringTokenizer st = new StringTokenizer(in.readLine());            int k = Integer.parseInt(st.nextToken());            int s = 0;            for (int j = 0; j < k; j++) s += Integer.parseInt(st.nextToken());            // int끼리 나누면 몫만 남으니 한쪽을 double로            out.append(String.format(Locale.ROOT, "%.2f", (double) s / k)).append('\n');            total += s;            count += k;        }        out.append(String.format(Locale.ROOT, "%.2f", (double) total / count)).append('\n');        System.out.print(out);    }}
C#Main.cs · 26 줄
using System;using System.Globalization;using System.Linq;using System.Text; class Program{    static void Main()    {        int m = int.Parse(Console.ReadLine());        var sb = new StringBuilder();        int total = 0, count = 0;        for (int i = 0; i < m; i++)        {            int[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();            int k = p[0];            int s = p.Skip(1).Sum();            // int끼리 나누면 몫만 남으니 한쪽을 double로            sb.Append(((double)s / k).ToString("F2", CultureInfo.InvariantCulture)).Append('\n');            total += s;            count += k;        }        sb.Append(((double)total / count).ToString("F2", CultureInfo.InvariantCulture)).Append('\n');        Console.Write(sb);    }}
C++main.cpp · 24 줄
#include <iomanip>#include <iostream> int main() {    std::ios::sync_with_stdio(false);    int m;    std::cin >> m;    int total = 0, count = 0;    std::cout << std::fixed << std::setprecision(2);    for (int i = 0; i < m; i++) {        int k;        std::cin >> k;        int s = 0;        for (int j = 0; j < k; j++) {            int x;            std::cin >> x;            s += x;        }        std::cout << static_cast<double>(s) / k << "\n";        total += s;        count += k;    }    std::cout << static_cast<double>(total) / count << "\n";}
Cmain.c · 20 줄
#include <stdio.h> int main(void) {    int m, k, x;    int total = 0, count = 0;    scanf("%d", &m);    for (int i = 0; i < m; i++) {        scanf("%d", &k);        int s = 0;        for (int j = 0; j < k; j++) {            scanf("%d", &x);            s += x;        }        printf("%.2f\n", (double)s / k); /* (double)로 바꾼 뒤에 나눈다 */        total += s;        count += k;    }    printf("%.2f\n", (double)total / count);    return 0;}
Craykonmain.cray · 17 줄
m = 콘솔.줄읽기().수로변환();total = 0;count = 0;반복 (i = 0; i < m; i++){    p = 콘솔.수들읽기();    k = p[0];    s = 0;    반복 (j = 1; j <= k; j++)    {        s += p[j];    }    콘솔.쓰기(글자.소수자리맞추기(s / k, 2));    total += s; // 학년 평균은 점수 합과 학생 수를 모아서 구한다    count += k;}콘솔.쓰기(글자.소수자리맞추기(total / count, 2));