for문을 이용해 각 배열의 첫 요소로 주어지는 배열의 개수와 평균을 구하고 .toFixed() 메서드를 이용해 답을 구해보려 한다.
const input = require('fs').readFileSync('test.txt').toString().split('\n');
const max = input[0];
for(let i=1;i<=max;i++) {
let num = input[i].split(' ');
let scope = num[0];
let cnt = 0;
let average = num.reduce((acc,v)=>acc+=v*1,0);
average /= scope;
for(let j=1;j<num.length;j++) {
if(num[j]>average) {
cnt++;
}
}
let result = ((cnt/scope)*100).toFixed(3);
console.log(`${result}%`)
}
// 40.000%
// 57.143%
// 33.333%
// 33.333%
// 44.444%
계산 방식엔 문제가 없는 것 같은데 출력이 꼬이는걸로 보아 average변수가 계산될 때 문제가 생긴 것 같다.
let average = num.reduce((acc,v)=>acc+=v*1,0);
average /= scope;
console.log(average)
// 71
// 78.85714285714286
// 81
// 81.33333333333333
// 96.88888888888889
배열마다 평균이 약 1 정도가 더 붙어있었는데, reduce()메서드를 쓰면서 배열의 합에 학생 수를 나타내는 각 배열의 첫 번째 숫자가 포함된 것이다 :(
reduce()가 받는 인수중엔 index 자리도 있어서 가능한지 찾게되면 추후에 수정하도록 한다.
+) 첫 번째 인수를 제외하는 방법
let average = num.reduce((acc,v)=>acc+=v*1,0)-num[0];
// reduce에서 손 볼 필요없이 그냥 변수에서 바로 빼주면 되는 거 였다,,,,
console.log(average)
다른 방법으로 .shift() 메서드를 이용해 처음부터 배열의 첫 번째 요소를 지우고 시작하면 선술 했던 문제가 해결된다.
const input = require('fs').readFileSync('test.txt').toString().split('\n');
const max = input[0];
for(let i=1;i<=max;i++) {
let num = input[i].split(' ');
let scope = num.shift(); //shift() 메서드는 원본 배열을 변경시킨다.
let cnt = 0;
let average = num.reduce((acc,v)=>acc+=v*1,0);
average /= scope;
// console.log(average)
for(let j=0;j<scope;j++) { // 인덱스0을 지웠기 때문에 j는 1이 아닌 0에서 출발해야 한다.
if(num[j]>average) {
cnt++;
}
}
let result = ((cnt/scope)*100).toFixed(3);
console.log(`${result}%`)
}
// 40.000%
// 57.143%
// 33.333%
// 66.667%
// 55.556%
'Study > Algorithm' 카테고리의 다른 글
[programmers / JavaScript] 숫자 문자열과 영단어 (0) | 2022.04.30 |
---|---|
<BEAKJOON / node.js> 10828 스택 (0) | 2022.04.29 |
<programmers / JavaScript> 직사각형 별찍기 (0) | 2022.04.14 |
<BEAKJOON> 14681 JavaScript (0) | 2022.03.31 |
<BEAKJOON / node.js> 10171, 10172 (0) | 2022.03.28 |