Algorithm/Baekjoon(Node.js)

[JavaSrcipt] Baekjoon - 4344 : 평균은 넘겠지

비망노트 2021. 9. 5. 22:01

문제

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

출력

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

 

예제입력 예제출력
5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91
40.000%
57.143%
33.333%
66.667%
55.556%

 

⭕ 풀이

const input=require('fs').readFileSync('/dev/stdin').toString().split('\n');
const c=Number(input[0]);

for(let i=1;i<=c;i++){
    let sum=0;
    let avg=0;
    let count=0;
    let percents=0;
    let students = input[i].split(' ')[0];
    let score = input[i].split(' ')
    
    for(let j=1;j<=students;j++){
        sum += +score[j]; 
    }
    for(let o=1;o<=students;o++){
        avg=sum/students;
        if(avg<score[o]){
        count++;
        }
        percents=count/students*100;
    }    
  console.log(percents.toFixed(3)+'%');
}

아우터루프에서 각 값을받을 변수들을 선언+초기화해주었다.

그 다음 각 점수총합을 구한뒤 그 값을 받아 평균을 구하고 비교후 count++를 했다.

 

❌ 처음에는 let o=1을 사용한 for문을 j를 사용한for문에 같이

 for(let j=1;j<=+students;j++){
        sum += +score[j];
        avg = sum/Number(students);
        if(avg< +score[j]){
            count++;
        }
        percents = count/Number(students)*100;
    }
    console.log(percents.toFixed(3) + '%');
}


////////////////////
❌output
100.000%
71.429%
66.667%
100.000%
88.889%

이런식으로 적었는데 이러면 j =1 일때 sum값은 50인상태에서 students로 나누니 10이되고

그값과 비교한다. 그 다음 j=2일때 sum은 이전50+50해서 100을 students로 나누니 20이되고

그값과 비교하게된다. 그래서 답이 ❌output 과 같이 나왔다.

 

그래서 동급 for문을 하나 더 적어줘 sum을 구하는 for문과 avg, count를 구하는 for문 따로 적어줬다.

 

 

✅ 다른분의 풀이

let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');

let num = input[0] * 1;

for (let i = 1; i <= num; i++) {
    let score = input[i].split(' ');
    let num2 = score.shift() * 1;
    let count = 0;
    
    let avg = score.reduce((acc, v) => acc += v * 1, 0);
    
    avg /= num2;

    for (let j = 0; j < num2; j++) {
        if (score[j] > avg) {
            count++;
        }
    }
    
    let result = ((count / num2) * 100).toFixed(3);
    
    console.log(result + "%");
}

 

 

 

-출처

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