한 반에 30명인 학생, 총 7개의 반 점수가 '국어, 영어, 수학, 사회, 과학' 순서로 있는 다중 리스트를 랜덤 한 값으로 만들어주시고 아래 값을 모두 출력하세요.
1. 반 점수 모두가 담긴 전교 점수 다중 리스트를 만들어주세요.
2. 반 평균을 구하세요.
3. 반 1등 점수를 구하세요.
4. 전교 평균을 구하세요.
(출력 형식은 상관없습니다.)
/**
* 반의 수, 학생 수, 과목 수가 담긴 객체를 받아 랜덤으로
* 반 점수 모두가 담긴 전교 점수 다중 리스트를 만드는 함수
*
* @param {Object} INFO_OBJ 반의 수, 학생 수, 과목 수가 담긴 객체
* @returns {number[][][]} 각 반으로 나누어진 리스트 return
*/
function makeRandomScoreList(INFO_OBJ) {
const CLASS_NUM = INFO_OBJ.CLASS_NUM;
const STUDENT_NUM = INFO_OBJ.STUDENT_NUM;
const SUBJECT_NUM = INFO_OBJ.SUBJECT_NUM;
let wholeSchoolScoreList = [];
for (let i = 0; i < CLASS_NUM; i++) {
let classScoreList = [];
for (let j = 0; j < STUDENT_NUM; j++) {
let studentScoreList = [];
for (let k = 0; k < SUBJECT_NUM; k++) {
studentScoreList.push(Math.floor(Math.random() * 100) + 1);
}
classScoreList.push(studentScoreList);
}
wholeSchoolScoreList.push(classScoreList);
}
return wholeSchoolScoreList;
}
/**
* 전교 점수 다중 리스트를 받아,
* 각 반의 평균을 구해서 리스트로 반환하는 함수
*
* @param {number[][][]} wholeSchoolScoreList 전교 점수 다중 리스트
* @returns {number[]} 각 반의 평균
*/
function getClassAverage(wholeSchoolScoreList) {
let classAverageList = [];
let subjectNum = 0;
for (const CLASS of wholeSchoolScoreList) {
const STUDENT_NUM = CLASS.length;
let studentAverageSum = 0;
let classAverage = 0;
for (const STUDENT_SCORE_LIST of CLASS) {
subjectNum = STUDENT_SCORE_LIST.length;
let studentSum = 0;
for (const SCORE of STUDENT_SCORE_LIST) {
studentSum += SCORE;
}
studentAverage = studentSum / subjectNum;
studentAverageSum += studentAverage;
classAverage = studentAverageSum / STUDENT_NUM;
}
classAverageList.push(classAverage);
}
return classAverageList;
}
/**
* 전교 점수 다중 리스트를 받아
* 각 반마다 1등 점수 리스트를 반환하는 함수
*
* @param {number[][][]} wholeSchoolScoreList 전교 점수 다중 리스트
* @returns {number[][]} 각 반마다의 1등 점수 리스트
*/
function getClassFirstPlaceScore(wholeSchoolScoreList) {
let firstPlaceScoreList = [];
for (const CLASS of wholeSchoolScoreList) {
let scoreSumList = [];
for (const STUDENT_SCORE_LIST of CLASS) {
let sum = STUDENT_SCORE_LIST.reduce((acc, cur) => (acc += cur));
scoreSumList.push(sum);
}
const MAX_SUM = Math.max(...scoreSumList);
const MAX_INDEX = scoreSumList.indexOf(MAX_SUM);
firstPlaceScoreList.push(CLASS[MAX_INDEX]);
}
return firstPlaceScoreList;
}
/**
* 각 반의 평균이 담긴 리스트를 받아
* 전교 평균을 구하는 함수
*
* @param {number[]} classAverageList 각 반의 평균이 담긴 리스트
* @returns {number} 전교 평균
*/
function getWholeSchoolAverage(classAverageList) {
const CLASS_NUM = classAverageList.length;
const WHOLE_SCHOOL_AVERAGE_SUM = classAverageList.reduce(
(acc, cur) => (acc += cur)
);
const WHOLE_SCHOOL_AVERAGE = WHOLE_SCHOOL_AVERAGE_SUM / CLASS_NUM;
return WHOLE_SCHOOL_AVERAGE;
}
function solution() {
let wholeSchoolScoreList = [];
let classAverageList = [];
let firstPlaceScoreList = [];
let wholeSchoolAverage = 0;
const INFO_OBJ = {
CLASS_NUM: 7,
STUDENT_NUM: 30,
SUBJECT_NUM: 5,
};
// 1. 반 점수 모두가 담긴 전교 점수 다중 리스트 만들기
wholeSchoolScoreList = makeRandomScoreList(INFO_OBJ);
// 2. 반 평균 구하기
classAverageList = getClassAverage(wholeSchoolScoreList);
// 3. 반 1등 점수 구하기
firstPlaceScoreList = getClassFirstPlaceScore(wholeSchoolScoreList);
// 4. 전교 평균 구하기
wholeSchoolAverage = getWholeSchoolAverage(classAverageList);
console.log('반 점수 모두가 담긴 전교 점수 다중 리스트');
console.log(wholeSchoolScoreList);
console.log('========================================');
console.log('반 평균');
console.log(classAverageList);
console.log('========================================');
console.log('반 1등 점수');
console.log(firstPlaceScoreList);
console.log('========================================');
console.log('전교 평균');
console.log(wholeSchoolAverage);
}
solution();
'PS > 제코베 JS 100제' 카테고리의 다른 글
제코베 JS 100제 / 93 / 페이지 교체 - 선입선출 알고리즘 (0) | 2022.10.07 |
---|---|
제코베 JS 100제 / 92 / 키보드 고장 (0) | 2022.10.07 |
제코베 JS 100제 / 90 / 같은 의약 성분을 찾아라! (1) | 2022.10.04 |
제코베 JS 100제 / 89 / 지식이의 게임 개발 2 (1) | 2022.10.04 |