[CodeKata]Day9. 가장 자주 등장한 숫자를 k 개수

최송희·2021년 3월 11일
0

CodeKata

목록 보기
6/8

문제

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

nums = [1,1,1,2,2,3],
k = 2

return [1,2]

nums = [1]
k = 1

return [1]

짱구굴리기

나의 초안은...난리가 났었더랬다
분명 쉽게 풀릴 줄알았는데...아직 js문법에 나약한 나인가 보다.

function topK(nums, k) {
  // 여기에 코드를 작성해주세요.
  let sortedNums = nums.sort();
  let finalArr = [];
  for (let cnum of sortedNums) {
    let obj = {};
    obj[cnum] = 1;
    finalArr.push(obj);
  }
  finalArr.forEach(function (value) {
    console.log(String(Object.keys(value)));
  });
  // console.log(Object.entries(finalArr));
  let oobject = Object.values(finalArr);
  console.log(oobject);
  oobject.sort(function (a, b) {
    return a[1] - b[1];
  });
  console.log("sorted : ", oobject);
}
console.log(topK([3, 1, 1], 2));

이것의 가장 문제는...Object안에서 key와 value를 뽑아 내고 그 value값으로 key를 정렬한 뒤 배열에 넣어...k갯수만큼 빼고싶은것! Object를 잘몰랐던 나... 굴레에 빠져버렸다...이중배열에 넣어서 정리한는 사람들도 있었지만...난 객체를 사용하고싶었다!! 지금은 숫자로만 배열이 들어오지만 나중에 문자배열이 들어올 경우를 대비하기 위해서!

결과

function topK(nums, k) {
  let obj = {};
  for (let num of nums) {
    if (num in obj) { //obj 객체의 key 값! 포함여부 확인! obj :  [ [ '1', 3 ], [ '2', 2 ], [ '3', 1 ] ]
      obj[num] += 1;
    } else {
      obj[num] = 1;
    }
  }
  let sortedKey = Object.keys(obj).sort(function (a, b) { // 객체 value값으로 key 정렬 반환
    return obj[b] - obj[a];
  });
  return sortedKey.splice(0, k).map((x) => parseInt(x)); //String key 값을 Int형으로 변환 반환할때 map돌리자!
}

console.log(topK([1, 1, 1, 2, 2, 3], 2));

배운점

  • Object의 속성키 포함 여부 확인
    if(속성key in obj){ ... } 또는 obj.hasOwnProperty(속성key)
    후...그전에는 얼마나 무식하게 포함여부를 확인했냐하믄..

    before
    if (Object.keys(left).indexOf(letter) > -1) { ... }
    after
    if (letter in left) { ... }

  • Object의 value값으로 key정렬 return
Object.keys(obj).sort(function (a, b) { //value기준으로 정렬시킨 뒤 key 배열 리턴
    return obj[b] - obj[a]; //value 값 기준 내림차순
}
  • splice(startIndex[, deleteCount])
    배열에서 요소 삭제 또는 교체 할때 사용하는데, 나의 경우 return할 배열의 갯수를 지정하여 요소를 뽑아내는 용도로 사용하였다.
    var myFish = ["angel", "clown", "drum", "mandarin", "sturgeon"];
    var removed = myFish.splice(3, 1);
    console.log(removed);	//[ 'mandarin' ]
    console.log(myFish);	//[ 'angel', 'clown', 'drum', 'sturgeon' ]

1개의 댓글

comment-user-thumbnail
2021년 3월 12일

오 CodeKata글이 자주 올라오네요.

저도 3달 후면 알고리즘 공부하려고 하는데

참고하겠습니다

답글 달기