출처
BOJ
https://www.acmicpc.net/problem/4344
문제
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.
나의 풀이
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().split('\n');
let num = Number(input[0]);
solution();
function solution() {
for (let i = 1; i <= num; i++) {
let score = input[i].split(' ');
let num2 = Number(score.shift());
let count = 0;
let avg = score.reduce((acc, v) => acc += Number(v), 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 + "%");
}
}
입력 첫번째 줄(input[0])은 테스트 케이스 개수 → 두번째 줄(input[1])부터 테스트케이스 만큼 반복할건데, 한 줄씩 출력 후 다음 반복으로 넘어갈 예정. → 일단 split 사용 하여 공백기준으로 input[i]를 쪼개 줌 → shift사용해서 score 첫번째 요소인 학생 수를 num2로 할당 → count는 평균 넘는 학생들을 찾을때마다 증가시킬 예정 → reduce로 학생들 평균구하기전 총합을 구하고 num2만큼 나눠서 avg를 구함. → shift로 첫번째 요소를 뺏기 때문에 score는 점수들의 배열로만 이루어져 있음 → 점수 배열들을 학생 수인 num2만큼 반복해서 점수가 평균보다 높으면 count를 1씩 증가 시켜줌 → 증가된 count 수를 학생 수 만큼 나눠서 x100을 하면 평균넘는 학생들의 비율을 구할 수 있음 → toFixed로 소수점 셋째 자리까지 출력하게함 → 한줄 출력 뒤 다음 줄을 똑같이 반복해서 테스트케이스만큼 평균넘는 학생 비율을 출력.
reduce
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().split('\n');
let num = Number(input[0]);
solution();
function solution() {
for (let i = 1; i <= num; i++) {
let score = input[i].split(' ').map(x => Number(x));
let num2 = score.shift();
let count = 0;
let avg = score.reduce((acc, v) => acc += v);
avg /= num2;
for (let j = 0; j < num2; j++) {
if (score[j] > avg) {
count++;
}
}
let result = ((count / num2) * 100).toFixed(3);
console.log(result + "%");
}
}
reduce 메서드의 두번째 파라미터를 제외한 코드다. 위의 나의 풀이에서 두번째 파라미터 초기값을 제외해버리면 score의 0번째 인덱스가 초기값이 되는데 타입이 string이라서 콜백함수 return이 “50” + 50으로 “5050”되어버린다. (문자열 + 숫자는 문자열이 반환됨) 그래서 score를 선언해줄때 map으로 Number을 적용시킨 숫자들의 배열로 만든 뒤 reduce에 요소들을 인자로 보내주면 두번째 파라미터를 생략해도 나의 풀이와 똑같이 작동한다. → 이 경우엔 가능하지만 콜백 함수 동작 횟수에 따라 결과가 차이 있을 경우면 오류로 이어지기에 웬만하면 생략하지말자.