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