[boj node.js] 백준 4344번 평균은 넘겠지 javascript

V·2021년 7월 9일
0
post-thumbnail

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

문제

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

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

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

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

예제 입력 1
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
예제 출력 1
40.000%
57.143%
33.333%
66.667%
55.556%

풀이

const fs = require('fs');
  const input = fs.readFileSync('dev/stdin').toString().trim().split('\n');
  const caseNum = +input[0];
  for(let i=1;i<=caseNum;i++){
    let crrCase = input[i].split(' ').map(val=>+val);
    let studentNum = crrCase[0];
    let scores = crrCase.splice(1,studentNum);
    let sum = scores.reduce((pre,cur)=>{return pre + cur})
    let average = sum/studentNum;
    let better = scores.filter((el) => average < el); 
    let ratio = better.length/studentNum*100;
    let ratioRound = ratio.toFixed(3);
    console.log(`${ratioRound}%`);
  }

전략

  • 케이스를 차례로 받아와서
  • 받아온 케이스의 평균을 구하고 배열에 담고 reduce 해서 다 더해서 학생수로 나누기
  • 케이스의 점수 중에 평균보다 큰 것들만 filter해서 length를 구하기
  • length/학생수*100 해서 출력. 근데 소숫점 4번째에서 반올림 해야 함 toFixed(3)

    실수

    // 우선 생각나는 대로 구현하고 제출 해 봤는데 틀렸다. 테스트는 안해봄. 찬찬히 뜯어봐야쓰것다. 적으면서 못미더운 부분도 많았으니.
    // 근데 범인을 바로 찾았다. splice 하는 것에 사소한 문제가 있었고, Arrow 함수에서 {}를 사용할 경우에는 꼭 return을 해 주어야 한다.
    // 테스트상에서는 되는데 백준 제출시 틀렸다고 나온다. 무엇이 문제인가? 난감하구먼.
    // 출력에 %를 안붙였다. 붙이니 맞음. 출력의 형태를 간과하지 말자.
    // for 보다 reduce로 배열의 합을 구하는 것이 메모리를 약 430K정도 덜 잡아먹는다.

profile
블로그 이전중 https://sungbeen.com

0개의 댓글