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순위 순서를 비교하여 정렬하였다.
그리고 요구사항대로 출력하였다