구현 - 백준 4344

경운·5일 전
0

코딩테스트

목록 보기
9/13
post-thumbnail

BOJ/백준 4344 - 평균은 넘겠지

백준 4344 - 평균은 넘겠지

1. 문제 분석

문제 이해

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

나도 90% 속했다ㅋㅋㅋㅋㅋ 문제가 마음이 아프네

입력

  • 첫째 줄에는 테스트 케이스 개수 C 입력
  • 둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 <= N <= 1,000)이 첫 수, N명의 점수(점수는 100보다 작거나 같은 정수)

출력

  • 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림해서 소수점 3번째 자리까지 출력
  • 정답과 출력 값의 절대/상대 오차는 10^-3이하면 상관없음 = 출력 값의 차이가 0.001 이하면 정답

2. 시간 복잡도

  • 바깥 for문

    • 테스트 개수 C번 반복
      💡O(C)
  • 안쪽 for문

    • 점수를 배열에 저장하고 총합 구하는 for문은 학생 수만큼 반복하니까 N번
    • 평균 넘는 학생 수 카운트 for문도 학생 수 만큼 반복하니까 N번
      💡N + N = 2N 번 수행되니까 O(N)

💡C번 도는 동안 안에서 N에 비례하는 연산이 수행되니까 O(C * N)


3. 코드 구현

import java.io.*;
import java.util.StringTokenizer;

public class No_4344 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int C = Integer.parseInt(br.readLine());
		
		for(int i = 0; i < C; i++) {
			
			StringTokenizer st = new StringTokenizer(br.readLine());

			// 학생 수 N
			int N = Integer.parseInt(st.nextToken());
			int[] score = new int[N];
			
			// 총점 소수점 계산해야하니 double 타입
			double sum = 0; 
			
			//1. 점수를 배열에 저장하고 총합 구하기
			for(int j = 0; j < N; j++) {
				score[j] = Integer.parseInt(st.nextToken());
				sum += score[j];
			}
			
			double avg = sum / N;
			double aboveAvg = 0;
			
			//2. 평균 넘는 학생 수 카운트
			for(int j = 0; j < N; j++) {
				if (score[j] > avg) {
					aboveAvg++;
				}
			}
			
			//3. 비율 계산 및 출력
			double ratio = (aboveAvg / N) * 100;
			System.out.printf("%.3f%%\n", ratio);
		}
	}
}

0개의 댓글