문제 링크 : https://www.acmicpc.net/problem/1546
1. 요구 사항 이해
시간, 메모리 제한 : 2초 / 128 MB
점수 중 최댓값 M을 기준으로 모든 점수를 점수/M*100으로 변환한다.
변환된 점수들의 새로운 평균을 계산한다.
입력 첫 줄: 시험 본 과목의 개수 N (N ≤ 1000)
입력 둘째 줄: 세준이의 현재 성적 (각각 0 ≤ 점수 ≤ 100)
변환된 점수들의 새로운 평균을 소수점 둘째 자리까지 출력한다.
2. 설계/검증
복잡도
시간 복잡도 | 최악의 경우 | 공간 복잡도 |
O(N) | O(N) |
최댓값을 찾기 위해 배열을 한 번 순회 O(N), 점수를 조작하고 합을 계산하기 위해 배열을 한 번 더 순회 O(N).
시간 복잡도는 O(N)
scores 배열을 사용하므로 공간 복잡도는 O(N)
3. 정상 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt(); // 시험 본 과목의 개수
//유효성 검사
if (N > 1000) {
System.out.println("시험 본 과목의 개수는 1000보다 작거나 같다");
return;
}
// 성적을 저장할 배열 선언과 초기화
int[] scores = new int[N];
int max = 0; // 최고점
for (int i = 0; i < N; i++) {
scores[i] = scan.nextInt();
// 유효성 검사
if (scores[i] > 100 || scores[i] < 0) {
System.out.println("100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다");
return;
}
if (scores[i] > max) {
max = scores[i];
}
}
// 성적 조작
double total = 0.0;
for (int score : scores) {
total += (double) score / max * 100;
}
// 결과 출력
System.out.println(total / N);
scan.close();
}
}
추가 정리
타입형 주의
나누기 100이 소수점이 있는 실수를 만들기 때문에 실수 타입형을 사용한다.
오차 범위
절대오차 또는 상대오차가 10^-2 이하라는 조건은 일반적으로 소수점 두 자리까지의 정확도를 요구하지만, 코드에서 출력하는 수가 문제의 허용 오차 범위 내에 있으면 정확하다고 판단됩니다. 즉, 소수점 아래 두 자릿수까지 맞추는 것이 아니라, 계산 결과가 0.01 단위 이하로 정확해야 합니다. 이를 수학적으로 증명하면, 출력의 정확도가 수치상으로 요구되는 오차 범위 내에 있는지 확인하면 됩니다.
'◖코딩 테스트◗▬▬▬▬▬▬▬▬▬ > 백준' 카테고리의 다른 글
[백준] 2566 최댓값 (설명/코드/정답) (0) | 2024.08.17 |
---|---|
[백준] 2738 행렬 덧셈 (설명/코드/정답) (0) | 2024.08.14 |
[백준] ✔️10811 바구니 뒤집기 (설명/코드/정답) (0) | 2024.08.12 |
[백준] ✔️3052 나머지 (설명/코드/정답) (0) | 2024.08.11 |
[백준] ✔️5597 과제 안 내신 분..? (설명/코드/정답) (0) | 2024.08.11 |