File tree Expand file tree Collapse file tree 1 file changed +14
-13
lines changed Expand file tree Collapse file tree 1 file changed +14
-13
lines changed Original file line number Diff line number Diff line change 4
4
5
5
class Solution {
6
6
public int [] topKFrequent (int [] nums , int k ) {
7
- // [풀이]
8
- // 1. <숫자: 빈도수>를 저장하는 HashMap과 [빈도수, 숫자]를 저장하는 PriorityQueue를 선언한다.
9
- // 2. HashMap에 숫자별로 빈도수를 함께 저장해서 해시테이블을 만든다.
10
- // [우선순위 큐에 사용된 자료구조]
11
- // 1. 별도 클래스를 선언
12
- // 2. 요구사항 자료형 배열을 선언한다.
13
- // 처음에는 별도 클래스를 선언했다가 값이 2개이며 알고리즘 로직 자체가 어려워서 int[] 구조로 풀이했다.
14
- // (주로 알고리즘이 어려우면 가독성이 나쁘더라도 자료구조를 단순화하는 습관이 있다)
15
- // [어려웠던 점]
16
- // 1. 우선순위 큐는 매번 요소가 추가될 때마다 내부 정렬을 수행하기 때문에 연산을 수행하면서 k개를 유지해야 한다.
17
- // 또한 기존 [빈도수, 숫자]를 버려야만 올바른 답을 도출할 수 있었다.
18
- // 2. [숫자, 빈도수]로 저장하는 것만 생각했더니 내부 정렬을 어떻게 하지 못해서 굉장히 고민했다. 정답은 반대였다.
19
-
7
+ /**
8
+ * for문이 총 3번 필요하다. (1.빈도_초기화, 2.큐에 저장, 3.결과배열에 할당
9
+ * 빈도_초기화 -> k:v로 쉽게 저장하는 자료구조
10
+ * 큐에 저장 -> 최소 힙으로 정렬되는 우선순위 큐 선언 -> 큐 같은 자료구조에서 k:v를 하고 싶다면 new int[2]가 가장 쉬움
11
+ * 결과배열에 할당 -> k개만큼 answer[]에 저장
12
+ *
13
+ * 문제는 상위 k개를 유지해야 하고 그를 위해서는 k개를 넘었을 때 빈도수가 낮은 순으로 flush하는 로직이 필요하다는 것.
14
+ * 큐는 선입선출 -> 빈도수가 낮을 수록 위로 정렬되게 해야 flush했을 때 빈도수가 낮은 순서대로 사라진다.
15
+ *
16
+ * 결과배열에 할당할 때는 그냥 앞에서부터 하면 된다.
17
+ * 이미 k개를 만족했고, 빈도수가 낮 -> 높 순서대로 그대로 쌓으면 된다.
18
+ *
19
+ * 우선순위큐에 할당할 때 [숫자, 빈도수]로 생각했지만, [빈도수, 숫자]가 맞았다.
20
+ */
20
21
int [] answer = new int [k ];
21
22
22
23
Map <Integer , Integer > map = new HashMap <>();
You can’t perform that action at this time.
0 commit comments