오늘 문제는 저번 문제와 비슷하다
nums = [1,1,1,2,2,3],
k = 2
return [1,2]
nums = [1]
k = 1
return [1]
풀이는 다음과 같다 ~
function topK(nums, k) {
const map = {};
const keys = [];
for(let i = 0; i < nums.length; i++) {
let number = nums[i];
if(map[number]) {
map[number]++;
} else {
map[number] = 1;
keys.push(number);
}
}
console.log(map); // 여기는 만든 객체
console.log(keys); // 여기는 순서 없이 key들을 모아논 배열
keys.sort((a,b) => {
return map[b] - map[a]; // 내림차순 반대로 하면 오름차순으로 정렬됨 값이 음수냐 양수냐에 따라서
})
console.log(keys); // 내림차순으로 keys가 정렬됨
return keys.slice(0,k); // slice로 원하는 갯수까지 자름
}
topK([3,3,3,4,1,1,2,2,], 2);
가장 먼저 숫자와, 숫자갯수를 저장할 객체, 그리고 가장 자주 등장한 숫자를 담아줄 배열을 선언한다
그리고 반복문을 돌려서 변수 number에 nums 요소를 넣고 조건을 준다 ~
if(map[number]) else{} 이 부분을 보면
만약 map[number]가 있다면 갯수가 있다는 소리니까 map[number]++로 갯수를 또 추가해주고
map[number]가 없으면 즉, 개수가 아직 하나도 안 들어있다는 거니까 갯수를 1로 해주면서 keys.push(number)로 키 들만 따로 배열을 만들어준다 ~ 갯수가 하나씩 이어야 하기 때문에 push를 여기다가 한다!
keys.sort((a,b) => {
return map[b] - map[a];
})
그리고 sort를 돌려서 return이 -로 나오면 내림차순, return이 +로 나오면은 오름차순 자동으로 정렬된다 ~ 신기함 !!
sort함수를 거치고 나면 keys 배열은 변형되어서 내림차순으로 정렬되어 있는것을 볼 수 있다.
우리가 원하는 가장 자주 등장한 숫자 순서대로 배열이 완성된 것이다 !!
그 다음에는 문제에서 말했듯이 k개수 만큼 리턴을 하라고 했으니까
slice 함수를 이용, 원하는 개수(k)가 만큼 잘라서 리턴하면 끝~
느낀점
좀 어렵긴 한데 저번에 푼 문제와 유사한 부분이 있어서 그럭저럭 할만 했다!!
항상 알고리즘을 풀 때는 처음 접근하는 방법을 생각하는 게 너무 어려운 것 같다.
그래도 계속해서 풀다보면은 문제를 봤을때 어떻게 풀 수 있겠다 점점 감이 잡히지 않을까??