본문 바로가기
Algorithms/코테 문풀

[프로그래머스] 등수 매기기 - JavaScript / ES6 ... 연산자란? 사용 예시

by hi-rachel 2023. 1. 12.

✏️ 문제 설명

영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 0 ≤ score[0], score[1] ≤ 100
  • 1 ≤ score의 길이 ≤ 10
  • score의 원소 길이는 2입니다.
  • score는 중복된 원소를 갖지 않습니다.

입출력 예

score result
[[80, 70], [90, 50], [40, 70], [50, 80]] [1, 2, 4, 3]
[[80, 70], [70, 80], [30, 50], [90, 100], [100, 90], [100, 100], [10, 30]] [4, 4, 6, 2, 2, 1, 7]

입출력 예 설명

입출력 예 #1

  • 평균은 각각 75, 70, 55, 65 이므로 등수를 매겨 [1, 2, 4, 3]을 return합니다.

입출력 예 #2

  • 평균은 각각 75, 75, 40, 95, 95, 100, 20 이므로 [4, 4, 6, 2, 2, 1, 7] 을 return합니다.
  • 공동 2등이 두 명, 공동 4등이 2명 이므로 3등과 5등은 없습니다.

 


 

✏️ 문제 풀이

- 내 풀이

function solution(score) {
    let result = [];
    for (let test in score) {
            result.push(score[test].reduce((a,b) => (a + b / 2), 0));
        }
        const sorted = result.slice().sort((a, b) => b - a);
        const rank = result.slice().map((v) => sorted.indexOf(v)+1);
        return rank;
}

[] 안에 []가 들어있어 for문 안에서 각 점수들의 평균을 구해주고 새로운 [] result를 만들어 넣어줬다.

높은 점수대로 내림차순 해준 sorted를 만들고,

result의 각 값의 sorted에서의 Index를 구해 + 1을 더해주면(index는 0에서부터 시작, 순위는 1부터 시작하기 때문에) 각 점수 평균의 순위를 구할 수 있다.

slice() 괄호 안에 아무것도 적어주지 않는다면 array가 그대로 복사되어 반환되기 때문에 result값을 변경하지 않고 사용할 수 있다.

 

function solution(score) {
    let result = [];
    for (let test in score) {
            result.push(score[test].reduce((a,b) => (a + b / 2), 0));
        }
        const sorted = [...result].sort((a, b) => b - a);
        const rank = [...result].map((v) => sorted.indexOf(v)+1);
        return rank;
}

slice()로 복사하지 않으려면 ES6 ...을 써줘도 똑같이 동작한다.

 

ES6 ... 연산자

... 확산 연산자(spread operator)를 사용하면 기존 배열 또는 객체의 전체 또는 일부를 다른 배열 또는 객체로 빠르게 복사할 수 있다.

예시)

const numbersOne = [1, 2, 3];
const numbersTwo = [4, 5, 6];
const numbersCombined = [...numbersOne, ...numbersTwo];    // output : 1,2,3,4,5,6

concat() 메서드와 비슷한 역할을 한다고 생각하면 된다. => 기존 배열을 바꾸지 않고 array를 합쳐 새로운 array를 반환.

concat() 메서드를 잘 모른다면? [참고 : 2023.01.09 - [JavaScript] - [Js] Array push와 concat의 차이]

 

[Js] Array push와 concat의 차이

JavaScript Array의 다양한 메서드를 공부하다 push와 concat의 차이가 궁금해졌다. push는 기존 배열에 원소를 추가하며 새로운 배열의 총길이를 반환하고, concat은 기존 배열을 복사한 후 원소를 추가하

hi-rachel.tistory.com

 

  • 종종 구조 분해와 함께 사용된다.
const numbers = [1, 2, 3, 4, 5, 6];
const [one, two, ...rest] = numbers;
// one : 1, two : 2, rest : 3,4,5,6

numbers 첫 번째 항목과 두 번째 항목을 변수에 할당하고 나머지는 배열에 넣는다.

 

  • 객체에도 사용할 수 있다.
const myVehicle = {
  brand: 'Ford',
  model: 'Mustang',
  color: 'red'
}

const updateMyVehicle = {
  type: 'car',
  year: 2021, 
  color: 'yellow'
}

const myUpdatedVehicle = {...myVehicle, ...updateMyVehicle};
console.log(myUpdatedVehicle);

console

myUpdatedVehicle는 각각 myVehicle, updateMyVehicle 객체를 복사해서 합친 객체를 반환한다.

 

- 다른 풀이

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

 

 

참고 사이트

Ranking numbers in an array using JavaScript

프로그래머스

w3schools

 

🙂 공부하면서 정리한 글입니다. 잘못된 점이 있다면 피드백 주시면 감사합니다.