loading

알고리즘/알고리즘JAVA

[백준알고리즘/1차원 배열] 1546번 문제 : 평균

침착곰 2021. 5. 5. 17:28
반응형

안녕하세요

백준 알고리즘 단계별로 풀어보기 5단계 평균을 풀어봤습니다

문제 자체는 어렵지 않았는데 문제를 이해하는게 좀 어려웠어요 ㅠ

한국어의 어려움이란 ㅎㄷㄷㄷㄷ

제가 풀었던 3가지 방식에 대해서 설명해보겠습니다!

 


문제

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

 

출력

첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.

 

 


문제 풀이

제가 첫 번째로 정답을 맞춘 방식입니다

제일 무난한 방식으로 풀었다고 생각합니다 ㅎ

Arrays.sort를 사용해 최대값을 구해 총점을 계산하는 방식입니다

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

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferdReader 선언 및 점수를 몇 번 입력할지 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		int N = Integer.parseInt(br.readLine());		
		
		// 점수를 넣을 배열 및 StringTokenizer 선언
		float[] array = new float[N];		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		// for문을 사용해서 배열에 점수 데이터를 입력
		for(int i = 0; i < N; i++)
		{
			array[i] = Integer.parseInt(st.nextToken());
		}
				
		// Arrays.sort를 사용해서 정렬 -> 마지막 값이 최대값이 된다
		Arrays.sort(array);
		
		// 총점 변수 및 반복문을 사용해 점수 / 최대값 * 100을 해서 새로운 총점을 구한다
		float sum = 0;		
		for(int i = 0; i < N; i++)
		{
			sum = (array[i] / array[N-1] * 100) + sum;
		}
		
		// 총점 / N = 결과 출력
		System.out.print(sum / N);
	}
}

 


두 번째 방식입니다

최대값을 구할 때 Arrays.sort를 사용하지 않고 반복문을 사용하여 Max값을 구해서 새로운 총점을 구한 방식입니다

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 {
		// BufferdReader 선언 및 점수를 몇 번 입력할지 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		int N = Integer.parseInt(br.readLine());		
		
		// 점수를 넣을 배열 및 StringTokenizer 선언
		float[] array = new float[N];		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		// for문을 사용해서 배열에 점수 데이터를 입력
		for(int i = 0; i < N; i++)
		{
			array[i] = Integer.parseInt(st.nextToken());
		}
		
		// 최대값 변수 초기화 및 반복문을 사용해서 배열의 최대값을 구한다.
		float Max = array[0];		
		for(int i = 1; i < N; i++)
		{
			if(Max < array[i])
				Max = array[i];
		}

		// 총점 변수 선언 및 반복문을 사용해 점수 / 최대값 * 100을 해서 새로운 총점을 구한다 
		float sum = 0.0f;
		for(int i = 0; i < N; i++)
		{
			sum = (array[i] / Max * 100) + sum;
		}

		// 총점 / N = 결과 출력
		System.out.print(sum / N);
	}
}

 


세 번째 방식입니다

아예 배열을 사용하지 않고 구했습니다

이건 제가 풀은 방식이 아니라 다른 사람이 풀은 것을 참고하여 작성했습니다;;

다른 사람이 푼 것을 보니 정말 깔끔하게 풀었더군요...

배열을 사용하지 않고 푸는 방식은 생각 못 했는데 하나 배웠습니다

그나마 다행인것은 속도는 제가 푼게 더 빠르게 나왔네요 하하핳

출처 : www.acmicpc.net/source/25677966

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

public class Main3 {
	public static void main(String[] args) throws IOException {	
		// BufferdReader 선언 및 점수를 몇 번 입력할지 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int num = Integer.parseInt(br.readLine());
		
		// 최대값 및 총점 변수 선언, StringTokenizer 선언
		int max = -1;
		float total = 0.0f;		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		// while문을 사용해 Max값과 총점을 구한다
		while(st.hasMoreTokens()){
			int value = Integer.parseInt(st.nextToken());
			if(value >max) {
				max = value;
			}
			total += value;
		}
	
		// 총점 / 최대값 * 100 / N을 하여 새로운 총점을 구한다
		System.out.println( ((total/max)*100.0)/num);
	}
}

 


속도 비교

1번 : Arrays.sort로 최대값 구함 + 배열 사용

2번 : 반복문으로 최대값 구함 + 배열 사용

3번 : 배열 미사용

방식입니다

 

제일 시간이 짧은 것은 1번 방식이 제일 빠르게 나왔습니다

3번 방식이 제일 빠를 줄 알았는데 제 예상과 달라서 좀 놀랐;;

 

제일 메모리가 적게 들은 방식은 2번 방식이네요

이건 예상한대로 나왔네요 ㅎㅎ

 

여기까지 백준알고리즘 1546번 문제를 풀은 내용이었습니다

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

 

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

이전 문제 : 2021.05.04 - [알고리즘/알고리즘JAVA] - [백준알고리즘/1차원 배열] 3052번 문제 : 나머지(자바/JAVA)

반응형
그리드형