반응형
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();
}
}
반응형
'문제풀이' 카테고리의 다른 글
[JAVA] 백준 1065번 한수 : 등차수열 (0) | 2021.07.10 |
---|---|
[JAVA] 백준 3052번 나머지 : 중복값 제거 (0) | 2021.07.10 |
[JAVA] 백준 2884번 알람시계 : 시간 (0) | 2021.07.10 |
[JAVA] 백준 4673번 셀프넘버 : 아리토스테네스의 체 (0) | 2021.07.10 |
[CODE UP 기초 종합 100제] 1095, 1099 with JAVA (0) | 2021.06.27 |