[알고리즘] 백준 2910 빈도정렬

Daon·2023년 3월 23일
0

알고리즘

목록 보기
1/11
post-thumbnail

C++로 알고리즘 테스트를 준비하고 있었지만
프론트엔드 알고리즘 테스트에서 JS로만 시험을 본다는 곳이 몇 곳 있어서
C++로 푼 문제를 JS로 풀어보려고 한다!

위에 문제를 봤을 때 자세히 봐야하는 것은
C로 주어지는 수들의 크기가 10억 미만이여서 일반적인 배열로 해결하면
메모리를 과도하게 쓸 수 있다.
1순위 수의 등장횟수가 많은 순으로 정렬
2순위 1순위가 같다면 먼저 등장한 순으로 정렬

function solution(n, c, nums) {
  const result = [];
  const mp = new Map();

  nums.map((item, index) => {
    if (mp.has(item)) {
      let [cnt, idx] = mp.get(item);
      cnt++;
      mp.set(item, [cnt, idx]);
    } else {
      mp.set(item, [1, index]);
    }
  });

  let arr = [];
  for (const [key, val] of mp) result.push([key, val]);

  arr.sort((a, b) => {
    if (a[1][0] == b[1][0]) return a[1][1] - b[1][1];
    return b[1][0] - a[1][0];
  });

  for (const [key, [cnt, idx]] of arr) {
    for (let i = 0; i < cnt; i++) {
      array.push(key);
    }
  }
  console.log(array);
  return result;
}

let number = [3, 2, 1, 2, 1, 1, 2, 3, 3];
solution(5, 2, number);

처음 map함수에서는 mp변수에 {해당숫자, [빈도수, 위치]] 값을 할당하였다
그 후 sort함수를 돌리기 위해 배열에 mp변수를 복사하였고
sort함수를 통해서 1순위 빈도수를 비교하였고 같은경우 2순위 순서를 비교하여 정렬하였다.
그리고 요구사항대로 출력하였다

profile
같이 일하고싶은 그런 개발자!

0개의 댓글