deo2kim
맞왜틀
deo2kim
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS
      • Algorithm
      • Data Structure
      • Network
      • DB
      • OS
    • Algorithm Problem
      • Python
      • JavaScript
    • Programming language
      • Python
      • JavaScript
    • Tool
      • Jquery
      • React
    • 개발
    • Infra

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
deo2kim

맞왜틀

[leetcode] Top K Frequent Elements
Algorithm Problem/JavaScript

[leetcode] Top K Frequent Elements

2024. 9. 28. 16:49
반응형

리트코드 문제: Top K Frequent Elements

이 문제는 배열에서 자주 등장하는 k개의 요소를 찾는 문제입니다. 예를 들어, 배열 [1,1,1,2,2,3]과 k = 2가 주어진다면, 가장 빈번하게 등장한 숫자는 1과 2이므로 [1, 2]가 답이 됩니다.


문제 분석

이 문제는 배열의 각 요소가 몇 번 등장하는지를 계산하고, 그중에서 자주 등장한 k개의 요소를 추출하는 문제입니다.


풀이 접근

  1. 빈도 계산
    먼저 배열에서 각 숫자가 몇 번 등장했는지를 파악해야 합니다. 이를 위해 **해시맵(Map)**을 사용해 각 숫자의 빈도를 기록할 수 있습니다.
  2. 빈도별 정렬
    각 숫자의 등장 횟수를 기준으로 배열을 정렬한 후, 그중에서 가장 빈번하게 등장한 k개의 요소를 추출하면 됩니다.

코드 설명

var topKFrequent = function(nums, k) {
    const numsMap = new Map();
    
    // 각 숫자의 빈도를 해시맵에 저장
    nums.forEach((num) => {
      numsMap.set(num, numsMap.has(num) ? numsMap.get(num) + 1 : 1);
    });

    const numAndCountArray = [];
    // 해시맵의 키(숫자)와 값(빈도)을 배열로 변환
    numsMap.forEach((value, key) => numAndCountArray.push([key, value]));

    // 빈도를 기준으로 내림차순 정렬
    const result = numAndCountArray.sort((a, b) => b[1] - a[1]);

    // 상위 k개의 숫자 반환
    return result.slice(0, k).map(([num, _]) => num);
};

코드 동작 방식:

  1. 해시맵으로 빈도 계산
    numsMap은 각 숫자(num)가 몇 번 등장했는지를 기록합니다. 만약 이미 해당 숫자가 해시맵에 존재하면 그 값을 1 증가시키고, 그렇지 않으면 새로 추가합니다.
  2. 해시맵을 배열로 변환
    numAndCountArray 배열은 각 숫자와 그 빈도를 저장한 배열입니다. [숫자, 빈도]의 형태로 각 항목을 담습니다.
  3. 빈도별 정렬
    sort 함수를 사용해 빈도를 기준으로 내림차순으로 정렬합니다. 즉, 가장 많이 등장한 숫자가 배열의 앞쪽에 오도록 정렬합니다.
  4. 상위 k개의 요소 추출
    정렬된 배열에서 상위 k개의 요소를 추출하고, 그 숫자만을 반환합니다.

시간 복잡도 분석

  • 해시맵을 채우는 과정: 배열을 한 번 순회하므로 O(n).
  • 정렬 과정: 정렬은 일반적으로 O(n log n).
  • 최종적으로 **O(n log n)**의 시간 복잡도를 갖습니다.

성능 결과

  • 실행 시간: 56ms (94.33% 보다 빠름)
  • 메모리 사용량: 52.04MB (92.56% 보다 적음)

이 코드는 간결하면서도 효율적으로 문제를 해결할 수 있는 방법을 제시합니다. 더 나은 성능을 원한다면 bucket sort 또는 heap을 사용해 정렬 단계를 최적화할 수 있습니다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm Problem > JavaScript' 카테고리의 다른 글

[leetcode] Longest Substring Without Repeating Characters  (0) 2024.09.27
[javascript] 프로그래머스 - 괄호 회전하기(월간 코드 챌린지 시즌2)  (0) 2021.08.14
[javascript] 프로그래머스 - 거리두기 확인하기(2021 카카오 채용연계형 인턴십)  (0) 2021.08.13
[javascript] 프로그래머스 - 숫자 문자열과 영단어(2021 카카오 채용연계형 인턴쉽)  (0) 2021.08.12
[javascript] 프로그래머스 - 행렬 테두리 회전하기(2021 Dev-Matching: 웹 백엔드 개발자(상반기))  (0) 2021.08.09
    'Algorithm Problem/JavaScript' 카테고리의 다른 글
    • [leetcode] Longest Substring Without Repeating Characters
    • [javascript] 프로그래머스 - 괄호 회전하기(월간 코드 챌린지 시즌2)
    • [javascript] 프로그래머스 - 거리두기 확인하기(2021 카카오 채용연계형 인턴십)
    • [javascript] 프로그래머스 - 숫자 문자열과 영단어(2021 카카오 채용연계형 인턴쉽)
    deo2kim
    deo2kim
    코딩 기록하기

    티스토리툴바