N명의 학생들의 성적이 학번순서대로 주어졌다.
학번 구간 [A, B]가 주어졌을 때 이 학생들 성적의 평균을 구하는 프로그램을 작성하라.
1 ≤ N ≤ 10^6 인 정수
1 ≤ K ≤ 10^4 인 정수
1 ≤ Si ≤ 100 인 정수
1 ≤ Ai ≤ Bi ≤ N
첫 번째 줄에 학생 수 N과 구간 수 K가 주어진다.
두 번째 줄에는 학생의 성적 Si (1 ≤ i ≤ N)가 주어진다. i + 2 (1 ≤ i ≤ K)번째 줄에는 i번째 구간 Ai, Bi가 주어진다.
i번째 줄에 i번째 구간의 성적평균(소수셋째자리에서 반올림)을 출력한다.
차이가 0.01이하이면 정답으로 채점됨.
5 3
10 50 20 70 100
1 3
3 4
1 5
26.67
45.00
50.00
Lv.3치곤 쉬운 문제라서 '이거 분명 시간초과 뜬다..'하고 제출했는데 통과해서 오히려 더 놀랐던 문제다.
for
문을 돌면서 구간 시작(start
)와 구간 끝(end
)를 구했다.grades_arr
)을 slice()
로 자르고, reduce()
로 누적 합을 구한 다음, 구간 길이로 나눠줬으며, 마지막으로 toFix()
를 사용하여 소수셋째자리에서 반올림했다.전체 코드는 다음과 같다.
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdput,
});
let lines = [];
rl.on("line", (line) => {
lines.push(line.split(" ").map(Number));
}).on("close", () => {
let grades_arr = lines[1]; // 학생 성적 배열
// 구간별 평균 구하기
for (let i = 2; i < lines.length; i++) {
let [start, end] = lines[i]; // [구간 시작, 구간 끝]
// 평균 계산
let avg = (
grades_arr.slice(start - 1, end).reduce((acc, cur) => acc + cur, 0) /
(end - start + 1)
).toFixed(2);
console.log(avg);
}
process.exit();
});
이전까지 반올림 함수로 Math.round()
만 알고 있었는데 이번 문제에서는 소수셋째자리에서 반올림을 해야했다.
찾아보니 toFixed()
라는 함수를 알게 되었다.
이번에 Math.round()
와 toFixed()
를 비교해 보려고 한다.
Math.round(x)
파라미터로 입력받은 숫자의
소수점 이하의 값이 0.5보다 크면, 입력받은 수보다 다음으로 높은 절대값을 가지는 정수를 리턴
소수점 이하의 값이 0.5보다 작으면, 입력받은 수보다 절대값이 더 낮은 정수 리턴
소수점 이하의 값이 0.5와 같으면, 입력받은 수보다 큰 다음 정수 리턴
// 정수 반올림
console.log(Math.round(1.222)); // 1
console.log(Math.round(1,777)); // 2
console.log(Math.round(-1.111)); // -1
console.log(Math.round(-1.88)); // -2
console.log(Math.round(null)); // 0
// 자릿수 지정
console.log(Math.round(1.222 * 10) / 10); // 1.2
console.log(Math.round(1.777 * 10) / 10); // 1.8
소수점 이하의 값을 올림(ceil
), 내림(floor
), 반올림(round
) 처리할 때 부동 소수점(Floating Point)의 정밀도 문제 때문에 예상치 못한 결과가 나오기도 한디.
console.log(1.005 * 100); // 100.49999999999999
console.log(Math.round(1.005 * 100) / 100); // 1
numObj.toFixed([digits])
digits
)를 전달하면, digits
만큼의 소수점 이하 자릿수를 가지는 문자열로 리턴numberObj
)의 소수점 이하 길이가 digits
보다 길면 숫자를 반올림하고, 짧으면 뒤를 0
으로 채워서 리턴console.log(1.222.toFixed(1)); // 1.2
console.log(1.5.toFixed(2)); // 1.50
console.log(1.777.toFixed(1)); // 1.8