코드카타 #2

소진수·2021년 7월 29일
2

algorithm

목록 보기
2/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) {
  // K 수만큼 가져올 숫자열들을 보관할 배열 변수
  let arr = [];
  // nums배열의 숫자열을 객체로 보관할 객체 변수
  let obj = {};
  let arr2 = [];
  // 배열 메서드, 콜백함수로 배열의 첫번째부터 마지막까지 반복하면서 함수 실행
  // for (let i = 0; i < nums.length; i++)
  nums.forEach((i) => {
    // 만약 객체에 배열의 값이 있다면
    // if(obj.hasOwnProperty(obj[i] === true) // 오브젝트안에 해당 값이 있다면 boolean으로 반환
    if (obj[i]) {
      // 객체의 해당 키의 값에 카운트를 올린다
      // obj[i] = ++
      obj[i]++;
    } else {
      // 객체 안에 값이 없다면 키와 값을 하나 생성시킴
      obj[i] = 1;
    }
  });

  // 이제 객체를 값의 크기순으로 정렬시켜야한다.
  // 구글링을 통해 for...in 함수로 객체를 반복시켜
  // 빈 배열에 push 메서드([반복되는 숫자, 객체의 반복되는 숫자])를 통해 배열에  넣는다
  for (let j in obj) {
    arr.push([j, obj[j]]);
  }

  // 해당 마지막 부분은 도움을 받았다.
  // 위 반복문 실행을 통해 배열이 된  객체를  정렬한다.
  // arr.sort((a,b) => b[1] - a[1])
  // sort는 정렬 순서를 정의하는 콜백함수를 통해 정렬한다.
  // https://hianna.tistory.com/409
  // sort에 매개변수 a, b가 주어진다면, 함수가 리턴하는 값이 0보다 작으면 a가 b보다 앞에 오도록 정렬한다. (작은 값부터)
  // sort에 매개변수 a, b가 주어진다면, 함수가 리턴하는 값이 0보다 크면 b가 a다 앞에 오도록 정렬한다. (큰 값부터)
  //
  return (
    arr
      // 배열안에 배열이 있기때문에 해당 배열의 2번째, 즉 기존 객체의 value 값을 선택해서 큰 값부터 정렬한다
      .sort((a, b) => b[1] - a[1])
      // 그리고 정렬한 배열의 0번부터 k번(원하던 개수)까지 슬라이스한다
      .slice(0, k)
      // 자주사용된 k개의 배열을 map으로 반복시켜 기존 객체의 키 값(배열의 첫번째 값)을 가져와서 리턴한다.
      .map((el) => Number(el[0]))
  );
}

🙆🏻‍♂️ 새롭게 배운 내용


Array.sort((a,b) => b - a)

  function topK(nums, k) {
    let arr = [];
    let obj = {};

    nums.forEach((i) => {
      if (obj[i]) {
        obj[i]++;
      } else {
        obj[i] = 1;
      }
    });

    for (let j in obj) {
      arr.push([j, obj[j]]);
    }

    return arr
      .sort((a, b) => b[1] - a[1])
      .slice(0, k)
      .map((el) => Number(el[0]));
  }
profile
느려서 바쁘다

1개의 댓글

comment-user-thumbnail
2021년 7월 31일

와 진수님 설명 너무 꼼꼼해요!!!!!

답글 달기