프로그래머스 lv0 등수 매기기

hyerin·2023년 4월 14일
0

문제
영어와 수학 점수를 담은 2차원 정수 배열 score가 주어 질때, 두 점수의 평균을 기준으로
매긴 등수를 담은 배열을 return 하세요

예시
score : [[80, 70], [70, 80], [30, 50], [90, 100], [100, 90], [100, 100], [10, 30]]
answer : [4, 4, 6, 2, 2, 1, 7]

위의 예시와 같이 공동 2등이 2명일 경우 다음 등수는 4등이라는 것이다. 평소에는 점수를 오름차순으로 정렬하는 함수 sort를 썼지만 이 문제는 다른 방법으로 접근해야 한다.

과정

  1. 두 점수를 평균을 구해 새로운 배열에 반환한다(map)
  2. 점수들을 다른 점수와 비교해 다른 점수보다 낮을 경우 등수에서 1을 더한다.
  3. 2번이 가능하려면 모두 1등에서 시작하는 새로운 배열 answer가 필요하다.
    (이 배열은 모든 값이 1이며 length가 score의 배열의 length랑 같다)

🌱 참고 풀이1

function solution(score) {
    const answer = new Array(score.length).fill(1);
    const avg = score.map(e => (e[0] + e[1] )/2);
        //모든 avg를 모든 avg와 비교한다.
    //두 수를 비교해서 더 작은 수의 값에 1을 더한다.
    //즉 해당 점수의 결과값은 자신보다 큰 수의 개수가 된다.
    for(let i = 0 ; i < avg.length ; i++){
        for(let j = 0; j < avg.length ; j++){
            if(avg[i] < avg[j])
                answer[i] ++;
        }
    }
    return answer;
}

이 풀이의 핵심은 자기 자신보다 높은 사람 수를 구하는 것이다. 동점일 경우 자신보다 높은 점수를 받은 사람의 수도 동일하게 만들어진다.

🌱 참고 풀이2

function solution(score){
  return score.map(e => {
    return (
      score.filter(v=> (v[0]+ v[1]) / 2 > (el[0] + el[1] /2 ).length + 1
                   );
      });
}

이 풀이의 경우 map을 사용해서 새로운 배열을 반환했다.
반환한 값의 경우 score를 filter하여 자신(평균)보다 큰 평균의 개수를 반환하였다. 시작은 1등부터이므로 1을 더했다.
앞 풀이와 푸는 방법은 유사하다.

profile
글쓰기의 시작은 나를 위해, 끝은 읽는 당신을 위해

0개의 댓글