백준
[백준] 1546 평균
Raming
2025. 2. 13. 20:10
- 문제 이해
- 세준이는 시험 점수를 조작하려고 한다.
- 최고 점수 M을 기준으로 모든 점수를 새로운 점수 = (현재 점수 / M) * 100 으로 변환한다.
- 변환된 점수들의 새로운 평균을 구하는 문제이다.
- 틀린 코드
package CLASS2;
import java.util.Scanner;
public class 평균 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int grade[] = new int[n];
int max = 0;
int avg = 0;
for(int i = 0; i < n; i++) {
grade[i] = sc.nextInt();
if (grade[i] > max) {
max = grade[i];
}
}
for(int i = 0; i < n; i++) {
if (grade[i] < max) {
grade[i] = grade[i] / max * 100;
}
}
for(int i = 0; i < n; i++) {
avg = grade[i];
}
System.out.println(avg);
}
}
|
1. 평균 구하는 방식이 잘못되었다..^^
- AVG = GRADE[I]; -> 배열의 마지막 값만 저장되었다. (평균 x)
- 해결 방법: sum을 따로 구한 후 sum / n을 출력해야 한다.
2. 새 점수 계산 방식에 오류가 있다.
- grade[i] = grade[i] / max * 100; -> int / int 연산이라 소수점이 사라진다.
- 해결 방법: double을 사용하여 grade[i[ * 100.0 / max로 연산해야 한다.
- 올바른 코드
package CLASS2;
import java.util.Scanner;
public class 평균 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 과목 개수 입력
int[] grade = new int[n]; // 점수 저장 배열
int max = 0; // 최고 점수 저장 변수
double sum = 0; // 새로운 점수 합계
for (int i = 0; i < n; i++) {
grade[i] = sc.nextInt(); // 점수 입력
if (grade[i] > max) {
max = grade[i]; // 최고 점수 찾기
}
}
for (int i = 0; i < n; i++) {
sum += (grade[i] * 100.0 / max); // 점수 변환 후 합계 계산
}
System.out.println(sum / n); // 새로운 평균 출력
sc.close();
}
}
|
- 수정된 부분
- 최댓값 찾기 (max): if (grade[i] > max) { max = grade[i]; } -> 최고 점수 저장
- 새로운 점수 계산 시 double 사용: grade[i] * 100.0 / max → 실수 연산으로 소수점 유지.
- 평균을 구할 때 sum / n 사용: 평균을 구하려면 반드시 sum 누적해서 더해야 한다.