코딩테스트 문제풀이/inflearn

[인프런] Node.js / 섹션2 - 1, 2차원 탐색 / 5. 등수구하기

sangchu 2023. 1. 8. 21:33

점수가 입력되면 각 학생의 등수를 입력된 순서대로 출력

 

나의 풀이

function solution(arr) {
  let answer = [];
  let order = [];
  let array = arr.slice();

  // 오름차순으로 정렬
  for (let i = 0; i < arr.length; i++) {
    order.push(Math.max(...array));
    array.splice(array.indexOf(Math.max(...array)), 1); // 해당 값 지우기
  }

  // 순위 매기기
  for (let i = 0; i < arr.length; i++) {
    answer.push(order.indexOf(arr[i]) + 1);
  }

  return answer;
}

let arr = [87, 92, 92, 100, 76];
console.log(solution(arr));

array 배열을 오름차순으로 정렬하여 order라는 배열을 만들었다.

Math.max()로 가장 큰 인자를 order배열로 push했으며, 해당 인자는 splice를 통해 지웠다.

splice는 원본 배열에 영향을 미치므로, 매개변수로 받은 arr를 array라는 새로운 변수로 만든 것이다.

array = arr; 로만 하면 얕은 복사가 되어 각 변수가 영향을 미친다.

따라서 arr.slice()로 깊은 복사를 했다.

 

오름차순으로 정렬한 뒤,

기존 배열인 arr가 몇번째 인덱스에 있는지 확인하며 등수를 매겼다.

 

강사 풀이

function solution2(arr) {
  let n = arr.length;
  let answer = Array.from({ length: n }, () => 1); // 길이를 n, 다 1로 초기화한 배열
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      if (arr[j] > arr[i]) {
        answer[i]++;
      }
    }
  }
  return answer;
}

let arr = [87, 92, 92, 100, 76];
console.log(solution2(arr));

먼저, Array.from()을 통해 등수를 다 1로 초기화 한 배열을 만들었다.

이중 for문을 통해, 해당 인자가 다른 인자보다 작으면 ++를 하여 등수가 하나 밀려나도록 했다.