티스토리 뷰
🎈 문제 및 해석
테스트 케이스의 총 개수, 각 과목의 총 학생 수, 해당 과목의 학생수가 차례대로 주어진다. 입력으로 들어오는 값의 종류가 총 세가지이므로 이들을 잘 분리하는 것, 평균을 구하는 것, 반올림하여 소수점 셋째 자리까지 구하는 것까지 이 세가지 항목이 이 문제의 핵심이라고 할 수 있다.
🎯 코드 및 문제 풀이
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() 사용
'Etc > Algorithm & Solving' 카테고리의 다른 글
[JS, Python] 문자열 내 p와 y의 개수 (0) | 2022.11.03 |
---|---|
[JS, Python] 약수의 합 구하기 (0) | 2022.10.08 |
[JS] 백준 10818 최대 최소 구하기 (0) | 2022.10.03 |
[JS, Python] 하샤드 수 구하기 (1) | 2022.09.30 |
[Python] 백준 1436 #문자열 포함 여부 확인 (0) | 2022.02.28 |