File tree Expand file tree Collapse file tree 1 file changed +47
-0
lines changed Expand file tree Collapse file tree 1 file changed +47
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * 문제 파악: 배열에서 가장 자주 등장하는 k개의 요소를 찾는 문제
3+ *
4+ * 접근 방식:
5+ * (1) Map을 사용하여 각 숫자가 배열에서 몇 번 등장하는지 빈도수 계산
6+ * (2) 문제의 요구사항에 따라 O(n log n)보다 빠른 시간 복잡도가 필요 => 버킷 정렬 활용 - 시간 복잡도 O(n)
7+ * (3) 가장 높은 빈도수를 가진 버킷부터 시작하여 k개의 요소를 결과 배열에 추가하여 리턴
8+ *
9+ * 코드 설명:
10+ * 각 숫자의 빈도수를 저장할 Map 생성해서, 모든 숫자의 빈도수 계산해서 저장
11+ * 빈도수를 기준으로 내림차순 정렬된 buckets 배열 생성 후,
12+ * 각 숫자를 빈도수[freq]에 해당하는 버킷에 넣기
13+ * 결과 리턴할 빈 배열 만들어주고,
14+ * 가장 높은 빈도수부터 시작하여 k개의 요소를 결과 배열에 추가
15+ * 반복문 끝나면 결과값 리턴
16+ */
17+
18+ /**
19+ * @param {number[] } nums
20+ * @param {number } k
21+ * @return {number[] }
22+ */
23+ var topKFrequent = function ( nums , k ) {
24+ const frequencyMap = new Map ( ) ;
25+
26+ for ( const num of nums ) {
27+ frequencyMap . set ( num , ( frequencyMap . get ( num ) || 0 ) + 1 ) ;
28+ }
29+
30+ const buckets = Array ( nums . length + 1 )
31+ . fill ( )
32+ . map ( ( ) => [ ] ) ;
33+
34+ for ( const [ num , freq ] of frequencyMap ) {
35+ buckets [ freq ] . push ( num ) ;
36+ }
37+
38+ const result = [ ] ;
39+
40+ for ( let i = buckets . length - 1 ; i >= 0 && result . length < k ; i -- ) {
41+ if ( buckets [ i ] . length > 0 ) {
42+ result . push ( ...buckets [ i ] . slice ( 0 , k - result . length ) ) ;
43+ }
44+ }
45+
46+ return result ;
47+ } ;
You can’t perform that action at this time.
0 commit comments