학점구하기

문제

학생들이 각자의 과제에 대해 상호평가를 합니다. 각 학생이 자신을 포함하여 평가한 점수가 배열로 주어집니다. 이 때 각 학생이 받은 점수의 평균을 구해 학점을 반환하는 로직을 작성해야 합니다. 최종 반환하는 형식은 ‘FBC’ 와 같이 0번 학생부터 순서대로 학점을 구해 문자열로 반환합니다. 단, 학생이 자신을 평가한 점수가 유일한 최고점수 혹은 최저점수라면 평균을 구할 때 제외합니다.

평균 학점
90점 이상 A
80점 이상 90점 미만 B
70점 이상 80점 미만 C
50점 이상 70점 미만 D
50점 미만 F

입력예시

scores = [
  [10, 20, 30], // 0번 학생이 0번, 1번, 2번 학생을 평가한 점수
  [70, 80, 90],
  [100, 0, 10],
];

제한사항

나의 풀이

function solution(scores) {
  let answer = '';

  // 평균 => 학점 변환
  const getGrade = average => {
    switch (true) {
      case average >= 90:
        return 'A';
      case average >= 80:
        return 'B';
      case average >= 70:
        return 'C';
      case average >= 50:
        return 'D';
      default:
        return 'F';
    }
  };

  const studentLength = scores.length;
  const receivedScoresListByStudent = Array.from(
    { length: studentLength },
    () => []
  );

  // 각 학생이 받은 점수로 변환
  for (let i = 0; i < studentLength; i++) {
    for (let j = 0; j < studentLength; j++) {
      receivedScoresListByStudent[j].push([i, scores[i][j]]);
    }
  }

  receivedScoresListByStudent.forEach((scores, myNumber) => {
    scores.sort((a, b) => b[1] - a[1]);

    // 최저점수 혹은 최고점수 제외
    const filterdScores = scores
      .filter((_, index, thisArr) => {
        if (
          index === 0 &&
          thisArr[index][0] === myNumber &&
          thisArr[index][1] !== thisArr[index + 1][1]
        )
          return false;

        if (
          index === studentLength - 1 &&
          thisArr[studentLength - 1][0] === myNumber &&
          thisArr[studentLength - 1][1] !== thisArr[studentLength - 2][1]
        )
          return false;

        return true;
      })
      .map(([_, score]) => score);

    // 평균 계산
    const average = filterdScores.reduce((acc, cur, index) => {
      if (index === filterdScores.length - 1)
        return (acc + cur) / filterdScores.length;
      return acc + cur;
    }, 0);

    answer += getGrade(average);
  });

  return answer;
}

const scores = [
  [100, 90, 98, 88, 65],
  [50, 45, 99, 85, 77],
  [47, 88, 95, 80, 67],
  [61, 57, 100, 80, 65],
  [24, 90, 94, 75, 65],
];

console.log(solution(scores) === 'FBABD');

다른 사람 풀이

  • 각 학생이 받은 점수로 변환 (열을 행으로 행을 열으로 바꾸는 방법)
const receivedScoresListByStudent = scores.map((_, i) => {
  // [scores[0][i], scores[1][i], scores[2][i]]를 반환하면 행과 열을 바꿀 수 있다.
  return scores.map(score => score[i]);
});

리펙토링

function solution(scores) {
  const getGrade = average => {
    switch (true) {
      case average >= 90:
        return 'A';
      case average >= 80:
        return 'B';
      case average >= 70:
        return 'C';
      case average >= 50:
        return 'D';
      default:
        return 'F';
    }
  };

  const receivedScoresListByStudent = scores.map((_, i) =>
    scores.map(score => score[i])
  );

  return receivedScoresListByStudent
    .map((scores, i) => {
      const myScore = scores.splice(i, 1)[0];

      if (myScore > Math.max(...scores) || myScore < Math.min(...scores))
        return scores;

      return [myScore, ...scores];
    })
    .map(scores =>
      getGrade(scores.reduce((acc, cur) => acc + cur, 0) / scores.length)
    )
    .join('');
}

출처:

프로그래머스 위클리 챌린지 2주차


Written by@[Tory]
I explain with words and code. I explain with words and code. I explain with words and code.