Skip to content

Commit 5c9fdf6

Browse files
authored
Merge pull request DaleStudy#1178 from sukyoungshin/main
2 parents ce513c1 + c32206a commit 5c9fdf6

File tree

5 files changed

+252
-0
lines changed

5 files changed

+252
-0
lines changed

contains-duplicate/sukyoungshin.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// 1번째 풀이 (hashMap)
2+
function containsDuplicate1(nums: number[]): boolean {
3+
const seen: Record<number, boolean> = {};
4+
5+
const isDuplicate = nums.some((num) => {
6+
if (seen[num]) return true;
7+
seen[num] = true;
8+
return false;
9+
});
10+
11+
return isDuplicate;
12+
};
13+
14+
// 2번째 풀이(Set)
15+
function containsDuplicate2(nums: number[]): boolean {
16+
const set = new Set();
17+
18+
for (const num of nums) {
19+
if (set.has(num)) {
20+
return true;
21+
}
22+
set.add(num);
23+
}
24+
25+
return false;
26+
};

house-robber/sukyoungshin.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// 1번풀이 (brute force)
2+
// function rob(nums: number[]): number {
3+
// const n = nums.length;
4+
// if (n === 1) return nums[0];
5+
// if (n === 2) return Math.max(nums[0], nums[1]);
6+
7+
// const dp: number[] = [];
8+
// dp[0] = nums[0];
9+
// dp[1] = Math.max(nums[0], nums[1]);
10+
11+
// for (let i = 2; i < n; i++) {
12+
// dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
13+
// }
14+
15+
// return dp[n - 1];
16+
// }
17+
18+
// 2번풀이 (dp)
19+
function rob(nums: number[]): number {
20+
if (nums.length <= 1) return nums[0] ?? 0;
21+
22+
const dp: number[] = [];
23+
dp[0] = nums[0];
24+
dp[1] = Math.max(nums[0], nums[1]);
25+
26+
for (let i = 2; i < nums.length; i++) {
27+
dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
28+
}
29+
30+
return dp[nums.length - 1];
31+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// 1번풀이
2+
function longestConsecutive2(nums: number[]): number {
3+
if (nums.length === 0) return 0;
4+
5+
const copiedNums = [...new Set(nums)].sort((a, b) => a - b);
6+
7+
let max = 1; // 지금까지 나왔던 가장 긴 연속 수열의 길이
8+
let count = 1; // 현재 연속 수열의 길이
9+
10+
for (let i = 1; i < copiedNums.length; i++) {
11+
const prev = copiedNums[i - 1];
12+
const current = copiedNums[i];
13+
14+
if (current === prev + 1) {
15+
count++;
16+
max = Math.max(max, count);
17+
} else {
18+
count = 1;
19+
}
20+
}
21+
22+
return max;
23+
};
24+
25+
// 2번풀이 (hashSet)
26+
function longestConsecutive(nums: number[]): number {
27+
const numSet = new Set(nums);
28+
let max = 0;
29+
30+
for (const num of numSet) {
31+
// 수열의 시작점인 경우만 탐색
32+
if (!numSet.has(num - 1)) {
33+
let current = num;
34+
let count = 1;
35+
36+
while (numSet.has(current + 1)) {
37+
current++;
38+
count++;
39+
}
40+
41+
max = Math.max(max, count);
42+
}
43+
}
44+
45+
return max;
46+
};
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// 1번풀이 (brute force)
2+
type FrequencyMap = Record<number, number>;
3+
4+
function topKFrequentCountDown(nums: number[], k: number): number[] {
5+
const freqMap = buildFrequencyMap1(nums);
6+
return pickTopKDescending(freqMap, k);
7+
};
8+
9+
function buildFrequencyMap1(nums: number[]): FrequencyMap {
10+
const map: FrequencyMap = {};
11+
for (const num of nums) {
12+
map[num] = (map[num] || 0) + 1;
13+
}
14+
return map;
15+
};
16+
17+
function pickTopKDescending(freqMap: FrequencyMap, k: number): number[] {
18+
const result: number[] = [];
19+
const entries = Object.entries(freqMap).map(([key, value]) => [
20+
Number(key),
21+
value,
22+
]);
23+
let currentFrequent = Math.max(...entries.map(([_, freq]) => freq));
24+
25+
while (result.length < k && currentFrequent > 0) {
26+
for (const [num, freq] of entries) {
27+
if (freq === currentFrequent) {
28+
result.push(num);
29+
if (result.length === k) break;
30+
}
31+
}
32+
currentFrequent--;
33+
}
34+
35+
return result;
36+
};
37+
38+
// 2번풀이(Bucket Sort)
39+
function topKFrequent(nums: number[], k: number): number[] {
40+
const frequencyMap = buildFrequencyMap2(nums);
41+
const frequencyBuckets = buildFrequencyBuckets(nums.length, frequencyMap);
42+
43+
return collectTopKFrequent(frequencyBuckets, k);
44+
};
45+
46+
function buildFrequencyMap2(nums: number[]): FrequencyMap {
47+
const freqMap: FrequencyMap = {};
48+
for (const num of nums) {
49+
freqMap[num] = (freqMap[num] || 0) + 1;
50+
}
51+
return freqMap;
52+
};
53+
54+
function buildFrequencyBuckets(
55+
size: number,
56+
freqMap: FrequencyMap
57+
): number[][] {
58+
const buckets: number[][] = Array(size + 1)
59+
.fill(null)
60+
.map(() => []);
61+
62+
for (const [numStr, frequent] of Object.entries(freqMap)) {
63+
const num = Number(numStr);
64+
buckets[frequent].push(num);
65+
}
66+
67+
return buckets;
68+
};
69+
70+
function collectTopKFrequent(buckets: number[][], k: number): number[] {
71+
const result: number[] = [];
72+
73+
for (let i = buckets.length - 1; i >= 0 && result.length < k; i--) {
74+
for (const num of buckets[i]) {
75+
result.push(num);
76+
if (result.length === k) break;
77+
}
78+
}
79+
80+
return result;
81+
};
82+
83+
// 3번풀이 (MinHeap)
84+
function topKFrequentHeap(nums: number[], k: number): number[] {
85+
const freqMap: Record<number, number> = {};
86+
87+
for (const num of nums) {
88+
freqMap[num] = (freqMap[num] || 0) + 1;
89+
}
90+
91+
const heap: [number, number][] = [];
92+
for (const [numStr, frequent] of Object.entries(freqMap)) {
93+
const num = Number(numStr);
94+
95+
heap.push([num, frequent]);
96+
heap.sort((a, b) => b[1] - a[1]);
97+
98+
if (heap.length > k) {
99+
heap.pop();
100+
}
101+
}
102+
103+
return heap.map(([num]) => num);
104+
};

two-sum/sukyoungshin.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// 1번째 풀이 (brute force)
2+
function twoSum1(nums: number[], target: number): number[] {
3+
for (let i = 0; i < nums.length; i++) {
4+
for (let j = 1; j < nums.length; j++) {
5+
const a = nums[i];
6+
const b = nums[j];
7+
8+
if (a + b === target && i !== j) {
9+
return [i, j];
10+
}
11+
}
12+
}
13+
return [];
14+
};
15+
16+
// 2번째 풀이 (indexOf)
17+
function twoSum2(nums: number[], target: number): number[] {
18+
for (let i = 0; i < nums.length; i++) {
19+
const j = target - nums[i];
20+
const index = nums.indexOf(j);
21+
22+
if (index !== -1 && i !== index) {
23+
return [i, index];
24+
}
25+
}
26+
return [];
27+
};
28+
29+
// 3번째 풀이 (HashMap)
30+
function twoSum3(nums: number[], target: number): number[] {
31+
const map: Record<number, number> = {};
32+
33+
for (let i = 0; i < nums.length; i++) {
34+
const complement = target - nums[i];
35+
36+
if (complement in map) {
37+
const j = map[complement];
38+
return [i, j];
39+
} else {
40+
map[nums[i]] = i;
41+
}
42+
}
43+
44+
return [];
45+
};

0 commit comments

Comments
 (0)