KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (486)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (431)
      • 백준 (187)
      • Programmers (104)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • js
  • Level 0
  • C
  • 수학
  • 문자열
  • 그래프
  • 제코베 JS 100제
  • 정렬
  • 백준
  • string
  • 다이나믹 프로그래밍
  • recursion
  • Level 1
  • codeup
  • tree
  • LeetCode
  • C++
  • Level1
  • programmers
  • Level 2

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun

Coding Note

제코베 JS 100제 / 91 / 반평균 등수
PS/제코베 JS 100제

제코베 JS 100제 / 91 / 반평균 등수

2022. 10. 7. 00:43

한 반에 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
    'PS/제코베 JS 100제' 카테고리의 다른 글
    • 제코베 JS 100제 / 93 / 페이지 교체 - 선입선출 알고리즘
    • 제코베 JS 100제 / 92 / 키보드 고장
    • 제코베 JS 100제 / 90 / 같은 의약 성분을 찾아라!
    • 제코베 JS 100제 / 89 / 지식이의 게임 개발 2
    KimMinJun
    KimMinJun

    티스토리툴바