티스토리 뷰


keyword : 2차원 배열
difficulty : 중
completion : ✅
notice :


평균은 넘겠지

📝 문제

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

출력

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

예제 입력 1

5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91

예제 출력 1

40.000%
57.143%
33.333%
66.667%
55.556%


🔍 정답

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.*;  

public class Main {  
    public static void main(String[] args) throws IOException {  

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        int C = Integer.parseInt(br.readLine());  

        int[][] array = new int[C][];  

        for (int i = 0; i < C; i++) {  
            int sum = 0;  
            float avg = 0;  
            int cnt = 0;  
            StringTokenizer st = new StringTokenizer(br.readLine());  
            int N = Integer.parseInt(st.nextToken()); 

            array[i] = new int[N+1];  
            array[i][0] = N;  
            for (int j = 1; j <= N; j++) {  
                array[i][j] = Integer.parseInt(st.nextToken());  
                sum += array[i][j];  
            }  

            avg = (float) sum / N;  
            for (int j = 1; j <= N; j++) {  
                if (array[i][j] > avg) {  
                    cnt++;  
                }  
            }  

            float result = (float) cnt / N * 100;  
            String results = String.format("%.3f", result);  
            System.out.println(results + "%");  
        }  
    }  
}
  • 입력값을 2차원 배열로 나타내기 위해 시간을 엄청 잡아먹었다 ㅠㅠ 구현 로직 자체는 어렵지 않았지만 2차원 배열이 익숙하지 않아서 콘솔창에 찍어보며 구현하느라 시간이 오래 걸렸고, 각 row마다 0번 인덱스에 계산에 포함하지 말아야 할 요소가 들어있어서 생각을 많이 하면서 풀어야 했다
  • 전체적인 풀이는, 2차원 배열에 각각의 입력값들을 담고 그 배열들을 돌면서 평균을 넘는 학생수의 비율을 출력하는 것이다.
    • C = 2 (총 row수)
    • [1번row][학생수, 점수, 점수, 점수]
    • [2번row][학생수, 점수, 점수, 점수, 점수, 점수]
    • 대략 이런식으로 배열을 만들어 나갈 것이다.
  • row C줄마다 N + 1개의 배열을 생성
    • array[i] = new int[N+1]; 를 한 이유
    • 0번 인덱스는 다음 인덱스들의 개수를 의미하므로 N+1개가 된다
    • 예시) 4 10 20 30 40 -> 4명의 학생이 각각 10, 20, 30, 40점이라는 뜻이므로 배열의 크기는 학생수가 몇 명인지 표기한 인덱스까지 포함하여 4+1개임
  • 각 row의 0번 인덱스는 N이므로, array[\i][0] = N; 라고 지정해주고 나머지는 2차원 배열을 돌면서 값을 채워주며, 평균을 구하기 위해 sum에 점수를 더해준다!
  • sum / N을 해서 평균을 구하고 각 인덱스가 평균보다 높으면 cnt를 하나씩 세어준다.
  • cnt / N * 100 을 하면 평균을 넘는 학생수의 비율이 나오고
  • 소수점 세자리까지 표현하기 위해 String.format을 사용하였다
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함