[ 성능 요약 ]
메모리: 19352 KB, 시간: 268 ms
[ 분류 ]
사칙연산(arithmetic), 수학(math)
[ 문제 설명 ]
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
[ 입력 ]
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
[ 출력 ]
첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.
import java.util.Scanner;
public class P1546_평균 {
public static void main(String[] args){
// 점수 변환하는 방법
// 원래점수 / 최댓값 점수 * 100
// 위와같이 점수를 바꾸고 난 후 다시 평균을 구하여 출력하는 코드
// ex) 4개의 과목을 보고 점수가 1, 100, 100, 100이다.
// 여기서 점수의 최댓값은 100이 된다.
// 점수를 변환하게 되면 각각 다음과 같이 변환한다.
// 1 --> 1 / 100 * 100
// 100 --> 100 / 100 * 100
// 100 --> 100 / 100 * 100
// 100 --> 100 / 100 * 100
// 위와같이 변경된 점수를 다 더하여 과목의 갯수 4 로 나누면 우리가 원하는 평균점수가 나온다.
// {(1/100*100)+(100/100*100)+(100/100*100)+(100/100*100)} / 4
// 여기서 {(1/100*100)+(100/100*100)+(100/100*100)+(100/100*100)} 얘를 다음과 같이 간단하게 줄일 수 있다.
// (1+100+100+100)/100*100 <-- 분배법칙 : AxC+BxC = (A+B)xC
// 그러면 변환된 점수의 평균은 이렇게 적을 수 있다. --> {(1+100+100+100)/100*100}/4
// 이걸 식으로 만들게 된다면,
// 과목의 갯수: N, 원래 점수: A, B, C 이고 가장 큰 점수를 C라고 할 때
// 변환된 점수들의 평균은 이와 같이 식으로 표현할 수 있게 된다.
// --> (A+B+C)/C*100/N = (원래점수들의 총합)/(최댓값 점수)*100/(과목의 개수)
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // 시험을 본 과목의 개수
int[] numArr = new int[N]; // 시험 점수들 저장할 int 형 배열
for(int i = 0; i < numArr.length; i++){ // 점수들을 배열에 입력받는다.
numArr[i] = sc.nextInt();
}
double sum = 0.0; // 시험점수 총합 담을 변수
double maxScore = 0.0; // 점수들 중 가장 높은 점수(최댓값 점수)
for(int i = 0; i < numArr.length; i++){
if(numArr[i] > maxScore)
maxScore = numArr[i];
sum += numArr[i];
}
// 변형된 점수들의 총 합(= 점수들 총합 / 최댓값 점수 * 100 / 과목개수) 출력하기
System.out.print(sum/maxScore*100/N);
}
}
[ 슈도코드 작성 ]
변수 N에 과목의 수 입력받기
길이가 N인 1차원 int형 배열 numArr[ ] 선언하기
for ( numArr[ ] 길이만큼 반복하기 ) {
numArr[ i ] 에 각 점수들 입력받기
}
시험점수 총합 변수 sum을 double형으로 선언하기
점수들 중 가장 높은점수(최댓값 점수) 변수인 maxScore을 double형으로 선언하기
for ( numArr[ ] 길이만큼 반복하기 ) {
if ( 인덱스 i의 배열 numArr 값이 maxScore 값보다 큰 경우 )
최댓값 점수 maxScore 를 그 numArr[ i ] 로 변경해주기
numArr[ i ] 값 총점 sum에 계속 더하기
}
sum / maxScore * 100 / N 출력하기
'Algorithm > Beakjoon' 카테고리의 다른 글
[Gold IV] 좋다_P1253 (0) | 2023.01.17 |
---|---|
[Gold III] 나머지 합_P10986 (0) | 2023.01.17 |
[Silver IV] 주몽_P1940 (0) | 2023.01.12 |
[Bronze IV] 숫자의 합_P11720 (2) | 2023.01.11 |
[Silver V] 수들의 합5_P2018 (0) | 2023.01.07 |