티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 1546번 평균

https://www.acmicpc.net/problem/1546

 

1546번: 평균

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

www.acmicpc.net

* 사용언어 : java, 자바

 

1. 문제

N개의 시험 성적을 입력받음

최대값 M을 찾은 후 모든 점수를 점수/M*100으로 변경

새로운 점수의 평균을 출력

 

2. 풀이

모든 점수를 M으로 나누는 연산을 진행해도 되지만,

N이 커지면 커질수록 나누기 연산을 하는 시간이 길어지게 됩니다.

 

다항식의 결합법칙을 생각해보면

a / M + b / M + ... + x / M = (a + b + ... + x) / M 이므로

모든 수를 전부 더한 후 나누기 연산은 한 번만 했습니다.

 

그리고 21 라인에서 100.0 을 먼저 쓴 이유는 다음과 같습니다.

1) 곱셈과 나눗셈은 연산 우선순위가 같아서 여러 개일 경우 왼쪽에서 오른쪽으로 순서대로 연산합니다.

2) 사칙연산의 연산자는 양 쪽의 값의 데이터 형을 비교하여 더 큰 데이터 형으로 강제 형변환 후 연산합니다.

 

위와 같은 이유로 double 형인 100.0을 가장 앞에 사용하여, 소수점 계산이 가능하게 했습니다.

마지막으로 문제의 출력 결과와 같게 출력하기 위해 printf 메서드를 사용했습니다.

 

3. 코드

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int total = 0;
		int max = 0;
		int score;
		for (int i = 0; i < n; ++i) {
			score = sc.nextInt();
			total += score;
			if (score > max) max = score;
		}
		sc.close();

		double avg = 0;
		avg = 100.0 * total / max / n;
		System.out.printf("%.2f", avg);
	}
}
728x90
반응형
댓글