[알고리즘] 가장 자주 등장한 숫자를 k 개수만큼 return

lilyoh·2020년 8월 17일
3

새로 배운 것

💎 배열 요소의 개수를 비교할 때에는 객체를 쓰면 좋다.

배열요소 in 빈 객체
  • for 문을 돌려서 위와 같이 값을 확인한다. 빈 객체의 키값으로 배열 요소가 있으면 해당 키의 value 값을 + 1 해준다. 빈 객체의 키값으로 배열 요소가 없으면 키 값을 만들어주고 value 값을 1 로 세팅해준다.

💎 sort 함수
sort 는 배열 메소드이다.
sort 함수의 인자로는 함수를 적어준다. 함수의 return 값이 음수일 때는 배열 요소의 순서를 뒤집어준다. return 값이 양수일 때는 배열 요소를 그대로 리턴한다.

💎 parseInt
배열의 요소가 string 일 때 map 과 parseInt 를 사용해서 배열 요소를 정수로 바꿔줄 수 있다.

문제

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

<case 1>
nums = [1,1,1,2,2,3],
k = 2

return [1,2]

<case 2>
nums = [1]
k = 1

return [1]

풀이

function topK(nums, k) {
  let obj = {}
  for (let i in nums) {
    nums[i] in obj ? obj[nums[i]] += 1 : obj[nums[i]] = 1
  }

  let sorted = Object.keys(obj).sort(function(a, b) {
    return obj[b] - obj[a]
  })

  return sorted.slice(0, k).map(x => parseInt(x))
}

느낀 점

코드카타를 2주 하면서 한번도 답을 보고 푼 적이 없었다. 그래서 단 하나의 문제도 풀지 못했다. 이번에는 처음으로 구글링을 해서 다른 사람의 풀이법을 참고해서 문제를 풀었다. 다른 사람의 풀이법을 보고 풀면 코드카타를 한 게 아니라는 생각이 들었다. 그래도 오늘 3 개나 새로운 코드를 배웠다. 코드카타 시간만 되면 짝궁에게 미안한 마음이 들고 낭패감이 들었다. 오늘 경험을 통해서 앞으로는 코드카타는 혼자 문제를 풀 수 있어야 한다는 강박을 가지지 않기로 했다. 모르면 답을 보고 새로운 것을 배우자. 대신 기록하자. 아이템 모으듯이 조금씩 문제 접근법을 써보다 보면 혼자서 문제를 풀 수 있는 날이 올 것 같다!

0개의 댓글