티스토리 뷰

 

🎈 문제 및 해석

 테스트 케이스의 총 개수, 각 과목의 총 학생 수, 해당 과목의 학생수가 차례대로 주어진다. 입력으로 들어오는 값의 종류가 총 세가지이므로 이들을 잘 분리하는 것, 평균을 구하는 것, 반올림하여 소수점 셋째 자리까지 구하는 것까지 이 세가지 항목이 이 문제의 핵심이라고 할 수 있다.

 

🎯 코드 및 문제 풀이

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


const testCase = Number(input[0]);
for(let i=1; i<=testCase; i++){
  let line = input[i].split(' ').map(i=>Number(i)); 
  let n = line[0];
  line = line.splice(1, n);  // 학생 수를 나타내는 0번째 수 제외를 위해 배열 자르기
  
  let sum = line.reduce((sum, curr) => sum+=curr, 0) // 평균 구하기
  let avg = sum/n;

  let pass = line.filter(i => avg<i);
  
  console.log(`${(Math.round((pass.length/n)*100000)/1000).toFixed(3)}%`);
}

1. 입력 데이터 분리

    - 먼저 들어오는 입력을 라인별로 나누어 문자열 리스트(input)에 저장한다. 

    - 최상단에 들어오는 테스트케이스를 제외한 나머지 라인은 양식이 똑같으므로 테스트케이스만 별도로 저장한다.

    - 테스트케이스 수만큼 for문을 돌리며 해당 line을 공백을 기준으로 나누고 map()을 이용해 모두 숫자형으로 변환한다.

    - 하나의 라인 내에서도 총 학생 수를 나타내는 수를 별도로 저장(n)하고 splice를 통해 실제 학생들의 점수만이 리스트에 남도록 한다.

2. 평균 구하기 (+평균 넘는 학생 구하기)

    - 평균을 구하기 위해서는 학생들 점수의 합계가 필요하므로 reduce()를 통해 구한다.

    - 해당 과목의 총 학생 수는 1에서 n에 저장을 해두었으므로 평균을 n으로 나누어 평균을 구할 수 있다.

    - 학생 점수 리스트를 순회하며 평균을 넘는 학생들을 추려내기 위해 filter()를 사용하여 다른 리스트(pass)에 저장한다.

3. 반올림하여 소수점으로 표현하기

    - 반올림은 Math.round()를 이용하면 표현할 수 있다. 평균을 넘는 학생 리스트의 길이를 n으로 나누어 해당 비율을 구하고, 우리는 소수점 셋째자리(.000)까지 백분율(.00)로 나타내어야하므로, 100000으로 곱하여 총 다섯번째까지 반올림을 할 수 있도록 한다. 반올림 연산을 끝마친 이후에 끝에 있는 세자리수는 소수점이므로 다시 1000으로 나누어 표현한다.

    - 소수점 셋째자리까지는 끝자리가 0이어도 채워져야하므로 toFixed로자리수를 설정해준다. 

 

 

💬 추가

- 배열 슬라이싱에는  splice(start, end)  사용

- 배열을 순회하며 특정한 값을 추출해야할 땐 reduce(callback, initialValue) 사용

- 값을 반올림할 땐 Math.round() => 반올림하여 정수형태로 나타내므로, 소수점을 나타내고자 할땐 별도의 과정 필요

- Number 자료형에 대해 자릿수를 고정하고 싶을땐 toFixed() 사용

Comments