문제풀이

[JAVA] 백준 1546번 평균 : 교환, 결합, 분배법칙

IT록흐 2021. 7. 10. 16:26
반응형
 

1546번: 평균

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

www.acmicpc.net

 

 

1. 문제 추상화

 

원래 성적에서 향상된 성적의 평균을 구하시오.

 

2. 알고리즘

 

다항식을 결합, 분배, 교환 법칙을 활용하여 단순화시키면 반복을 줄일 수 있다.

 

입력된 과목의 개수 = n ( n이 3이라고 가정 )

입력된 세 과목 점수 = a, b, c 

세 과목 중 최고 점수 =  M 

 

avg = ( ( a/M * 100 ) + ( b/M * 100 ) + ( c/M * 100 ) ) / 3    // 분배법칙 적용

     = ( ( a + b+ c ) * ( 100 / M ) ) / 3    // 반복 횟수 감소

 

 

내 풀이 ( 분배법칙 적용 X )

 

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 Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer stz;
		
		int size = Integer.parseInt(br.readLine());
		stz = new StringTokenizer(br.readLine()," ");
		
		double[] scoreArr = new double[size];
		int i = 0;
		double[] upgradeScore = new double[size];
		
		int value = Integer.parseInt(stz.nextToken());
		scoreArr[i] = value;
		int M = value;
		
		while(stz.hasMoreTokens()) {
			value = Integer.parseInt(stz.nextToken());
			scoreArr[++i] = value;
			if( value > M ) {
				M = value;
			}
		}
		// 분배법칙을 적용하지 않아 for문을 돌려줘야 함
		double sum =0;
		for( int j =0; j<size;j++) {
			upgradeScore[j] = scoreArr[j]/M*100 ;
			sum += upgradeScore[j];
		}
		
		bw.write((sum/size)+"");
		bw.flush();
		bw.close();
		br.close();
		
	}

}

 

일반적인 풀이 ( 분배법칙 적용 )

 


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 Main1 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer stz;
		
		int size = Integer.parseInt(br.readLine());
		stz = new StringTokenizer(br.readLine()," ");
		double sum = 0;
		double max = 0;
		
        
		for(int i=0;i<size;i++) {
			double value = Double.parseDouble(stz.nextToken());
			sum += value;
			if( value > max ) {
				max = value;
			}
		}
		// 반복없이 바로 계산 가능
		double avgUpgradeScore = (sum/max*100)/size;
		
		bw.write(avgUpgradeScore+"");
		bw.flush();
		bw.close();
		br.close();
	}

}
반응형