본문 바로가기
백준 풀이

[백준 풀이_Java] 4344 평균은 넘겠지

by happyhelen 2021. 8. 27.

 

 

 

 

내가 푼 방법

 

BufferedReader 와 StringTokenizer 을 사용한 풀이이다

 

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

public class Main {
	public static void main(String[] args) throws IOException {
			
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int C = Integer.parseInt(in.readLine()); // 테스트케이스의 개수C
		StringTokenizer strTkn;
		int[] student;
		
		// [1] 학생수를 따로 받지 않고 점수랑 같이 Tokenizer 에서 한번에 받고 처리할때 구분한다
		// 그리고 입력값 받는것 부터 반복문안에 들어가야 한다
		
		for(int i=0; i<C; i++) {
			strTkn = new StringTokenizer(in.readLine(), " ");
			int N = Integer.parseInt(strTkn.nextToken()); // String 으로 반환되므로 Integer로 변환
			student = new int[N];
			
			// 성적 배열에 넣고 합구하기
			double sum =0;
			for(int j=0; j<N; j++) {
				student[j] = Integer.parseInt(strTkn.nextToken());
				sum += student[j];
				}
               
			// [2] 틀렸던 원인: 퍼센트를 표현하는 데 있어서 double 과 int의 차이
			double smart = 0;
			// 비교하기
			for(int k=0; k<N; k++) {
				if(student[k] > sum/N) smart++;
			}
			
			System.out.printf("%.3f%%%n",(smart/N)*100);
			}
	}
}

 

 

 

[2] 에서 틀린 이유)

평균 이상의 학생수를 담는 smart 를 int타입으로 하면

나중에 smart/N 에서 1 미만의 몫은 0으로 표현되므로 계속 0이 나온다
퍼센트는 실수에다가 100을 곱한 값이므로 실수가 표현되려면 smart 나 N을 double 타입으로 해줘야함
혹은 smart/N을 double 로 강제변환 할 수 도 있음

 

처음에 sum과 N 의 값은 제대로 나오는데 sum/N 의 값이 계속 0이 나와서

로컬변수와 전역변수를 사용하는 데 있어서 잘못된 부분이 있는 줄 알고 헤맸지만

결국에 타입의 문제였고 이번에 타입의 중요성을 다시 알게 되었다