loading

알고리즘/알고리즘JAVA

[백준알고리즘/1차원 배열] 4344번 문제 : 평균은 넘겠지(자바/JAVA)

침착곰 2021. 5. 7. 13:13
반응형

안녕하세요

백준 알고리즘 단계별로 풀어보기 5단계 평균은 넘겠지를 풀어봤습니다

이번 문제는 쉽지 않았습니다

지금까지 풀면서 제일 고민을 많이하면서 풀은 문제 같습니다

문제를 열심히 보다보면 답이 못 나올 문제는 아니었습니다

제가 푼 방식에 대해서 알아보겠습니다!!

 


4344번 : 평균은 넘겠지

www.acmicpc.net/problem/4344

 

4344번: 평균은 넘겠지

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

www.acmicpc.net

문제

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

 

입력

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

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

 

출력

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

 

 


문제 풀이

문제는 두 번 풀었습니다

첫 번째는 맨 처음 정답을 맞췄을 때 풀은 방식입니다

많이 지저분하게 풀었습니다...;;

두 번째 방식은 첫 번째 방식에서 많이 다듬어서 풀었습니다

 


첫 번째 방식입니다

정답은 나왔지만 지저분합니다 ㅠㅠ

풀이에 대한 자세한 설명은 두 번째 방식에서 하겠습니다...;;

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 br = new BufferedReader(new InputStreamReader(System.in));		
		int N = Integer.parseInt(br.readLine());
		
		String[] strArray = new String[N];
		StringBuilder sb = new StringBuilder();
		
		for(int i = 0; i < N; i++)
		{
			strArray[i] = br.readLine();
		}
		
		for(int i = 0; i < N; i++)
		{
			StringTokenizer st = new StringTokenizer(strArray[i], " ");
			
			int Count = 0;
			int People = Integer.parseInt(st.nextToken());
			int[] intArray = new int[People];
			
			while(st.hasMoreTokens())
			{
				intArray[Count] = Integer.parseInt(st.nextToken());
				Count++;
			}
			
			float sum = 0;
			
			for(int j = 0; j < People; j++)
			{
				sum += intArray[j];
			}
			
			float average = sum / People;
			float incount = 0;
			
			for(int j = 0; j < People; j++)
			{
				if(average < intArray[j])
				{
					incount++;
				}
			}
			
			sb.append(String.format("%.3f", (incount / People * 100)) + "%\n");
			
		}
		
		System.out.print(sb);
	}
}

 


두 번째 방식입니다

1. 각 학생들의 점수정보를 배열에 넣고 동시에 합계를 구합니다

2. 평균 = 합계 / 학생 수로 평균을 구합니다

3. 반복문을 사용하여 평균보다 점수가 큰 학생의 인원 수를 구합니다

4. 결과를 출력해줍니다

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

public class Main2 {
	public static void main(String[] args) throws IOException {
		// Reader 및 Write 변수 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		// 테스트 케이스 N 입력
		int N = Integer.parseInt(br.readLine());
		
		// StringTokenizer 선언
		StringTokenizer st;
		
		// N만큼 반복
		for(int i = 0; i < N; i++)
		{
			st = new StringTokenizer(br.readLine());
		
			// 인원 수 입력
			int num = Integer.parseInt(st.nextToken());
			
			// 점수 배열 및 합계, 평균이상 인원수 변수 선언
			int score[] = new int[num];
			int sum = 0;
			float row_count = 0;
			
			// 반복문을 사용 학생들의 점수 입력 및 합계를 계산
			for(int j = 0; j < num; j++)
			{
				score[j] = Integer.parseInt(st.nextToken());
				sum += score[j];
			}
			
			// 평균 계산
			float aver = (float) sum / (float) num;
			
			// 반복문을 사용 평균보다 높은 학생 수를 계산
			for(int j = 0; j < num; j++)
			{
				if(aver < score[j])
					row_count++;
			}
			
			// 평균 이상 학생 수 / 총 인원 * 100으로 결과를 입력
			bw.write(String.format("%.3f%%\n", row_count/num*100));
		}
		
		// 결과 출력 및 Reader/Write 닫기
		br.close();
		bw.flush();
		bw.close();
	}
}

 

여기까지 문제풀이 설명이었습니다!

자세한 설명은 주석을 참고바랍니다

 


속도 비교

 

여기까지 백준 알고리즘 4344번 평균은 넘겠지를 풀은 내용이었습니다

단계별로 풀어보기 1차원 배열 문제는 여기까지 마무리가 되었네요

다음 글에서는 6단계 함수를 풀어보겠습니다!

이상 이 글이 알고리즘을 공부하는 분들께 도움이 되었으면 좋겠습니다!

 

이전 문제 : 2021.05.06 - [알고리즘/알고리즘JAVA] - [백준알고리즘/1차원 배열] 8958번 문제 : OX퀴즈(자바/JAVA)

반응형
그리드형