✏️기록하는 즐거움
article thumbnail

Link

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

문제

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다.
당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력 > 첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
출력 > 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

| 예제 입력

5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91

| 예제 출력

40.000%
57.143%
33.333%
66.667%
55.556%

 

제출

const input = (
  process.platform === "linux"
    ? require("fs").readFileSync("/dev/stdin").toString()
    : `5
      5 50 50 70 80 100
      7 100 95 90 80 70 60 50
      3 70 90 80
      3 70 90 81
      9 100 99 98 97 96 95 94 93 91`
).split("\n");

const num = Number(input[0]);

for (let i = 1; i <= num; i++) {
  let [student, ...score] = input[i].trim().split(" ");

  let avg = score.reduce((sum, v) => (sum += v * 1), 0) / student;
  let count = 0;

  for (let j = 0; j < student; j++) {
    if (avg < score[j]) {
      count++;
    }
  }

  console.log(`${((count / student) * 100).toFixed(3)}%`);
}

 

풀이과정

for (let j = 0; j < student; j++) {
    sum += score[j]
}

if (avg < score[j]) {
  count++;
}

🔼 처음엔 두 번째 for문에서 sum을 구하고, for문 밖에서 평균을 구해서 score[j]랑 비교하려 했는데

그렇게 되면 j를 사용할 수 없기 때문에 score[j]와 평균을 비교할 수 없었다.

 

따라서 reduce로 평균을 구했더니 해결되었다.

개념

Array.prototype.reduce()

  • 배열의 각 요소에 대해 주어진 reducer 함수를 실행한 결과값을 반환한다.
  • 매개변수는 다음과 같다.
    • 콜백함수
      • 누산기
      • 현재 처리할 값
      • 처리할 값의 인덱스, 초기값을 제공할 경우 0부터 그렇지 않을 경우 1부터 시작한다. (optional)
      • 처리할 값의 원본 배열 (optional)
    • 초기값 (optional)
      • 지정하지 않으면 배열의 첫 번째 요소를 초기값으로 사용한다. 

Comment

'Algorithm > Baekjoon' 카테고리의 다른 글

[백준] 1065: 한수 (javascript)  (0) 2022.06.27
[백준] 4673: 셀프 넘버 (javascript)  (0) 2022.06.27
[백준] 8958: OX퀴즈  (0) 2022.06.17
[백준] 1546: 평균  (0) 2022.06.17
[백준] 3052: 나머지(javascript)  (0) 2022.06.15
profile

✏️기록하는 즐거움

@nor_coding

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!