Skip to content

Commit 8e4ca06

Browse files
committed
코드 수정
- longestConsecutive - bucket sort 사용 - top-k-frequent-elements - 코드 최적화
1 parent 8f66c84 commit 8e4ca06

File tree

2 files changed

+34
-21
lines changed

2 files changed

+34
-21
lines changed

longest-consecutive-sequence/seungseung88.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@ const longestConsecutive = (nums) => {
1818
// 일단 연속되는 배열에서는 가장 최솟값을 찾음
1919
if (!set.has(v - 1)) {
2020
let cnt = 1;
21-
2221
// 연속되는 배열에서 가장 긴 배열을 저장
2322
while (set.has(v + cnt)) {
2423
cnt += 1;
25-
longest = longest < cnt ? cnt : longest;
2624
}
25+
longest = Math.max(longest, cnt);
2726
}
2827
});
2928

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,46 @@
11
/**
2-
* 시간 복잡도: O(n log n)
3-
* - nums 배열 순회하며 빈도수 카운트: O(n)
4-
* - 빈도수 기준 내림차순 정렬: O(n log n)
5-
* - 상위 k개 선택: O(k) -> k는 n보다 작으므로 무시
2+
* 시간 복잡도: O(n)
3+
* - nums 순회하며 map 생성 O(n)
4+
* - map 순회하며 bucket 생성 O(n)
5+
* - bucket 순회하며 결과 찾음 O(n)
66
*
77
* 공간 복잡도: O(n)
8-
* - countNums 객체: 최악의 경우 모든 숫자가 다른 경우 O(n)
9-
* - sortedCountNums 배열: countNums와 동일한 크기 O(n)
10-
* - answer 배열: k 크기이지만 k는 n보다 작으므로 무시
8+
* - map O(n)
9+
* - bucket O(n)
10+
* - result k
1111
*/
1212
const topKFrequent = (nums, k) => {
13-
// 각 숫자의 빈도수를 저장하는 객체
14-
const countNums = {};
13+
// nums 요소 : 요소의 갯수
14+
const map = {};
15+
// 요소의 갯수 : Set{ nums 요소 }
16+
const bucket = [];
17+
18+
const result = [];
1519

16-
// nums 배열을 순회하며 각 숫자의 빈도수를 카운트
1720
for (let i = 0; i < nums.length; i += 1) {
18-
const num = nums[i];
19-
countNums[num] = !countNums[num] ? 1 : countNums[num] + 1;
21+
if (map[nums[i]]) {
22+
map[nums[i]] += 1;
23+
} else {
24+
map[nums[i]] = 1;
25+
}
2026
}
2127

22-
// 빈도수를 기준으로 내림차순 정렬
23-
const sortedCountNums = Object.entries(countNums).sort((a, b) => b[1] - a[1]);
24-
const answer = [];
28+
for (let [num, freq] of Object.entries(map)) {
29+
if (bucket[freq]) {
30+
bucket[freq] = bucket[freq].add(num);
31+
} else {
32+
bucket[freq] = new Set().add(num);
33+
}
34+
}
2535

26-
// 상위 k개의 숫자를 answer 배열에 저장
27-
for (let i = 0; i < k; i += 1) {
28-
answer[i] = Number(sortedCountNums[i][0]);
36+
for (let i = bucket.length - 1; i >= 0; i -= 1) {
37+
if (bucket[i]) {
38+
// string을 number로 변환
39+
const value = Array.from(bucket[i], Number);
40+
result.push(...value);
41+
}
42+
if (result.length === k) break;
2943
}
3044

31-
return answer;
45+
return result;
3246
};

0 commit comments

Comments
 (0)