코드카타 2주차 #4

김태현·2020년 11월 12일
0

코드카타

목록 보기
8/9
post-thumbnail

오늘 문제는 저번 문제와 비슷하다

  • 문제
    nums는 숫자로 이루어진 배열입니다.
    가장 자주 등장한 숫자를 k 개수만큼 return해주세요.

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)가 만큼 잘라서 리턴하면 끝~

느낀점
좀 어렵긴 한데 저번에 푼 문제와 유사한 부분이 있어서 그럭저럭 할만 했다!!
항상 알고리즘을 풀 때는 처음 접근하는 방법을 생각하는 게 너무 어려운 것 같다.
그래도 계속해서 풀다보면은 문제를 봤을때 어떻게 풀 수 있겠다 점점 감이 잡히지 않을까??

profile
프론트엔드 개발자

0개의 댓글