Skip to content

Commit a907843

Browse files
authored
Merge pull request #1136 from seungseung88/main
[seungseung88] WEEK 01 solutions
2 parents 8cccb46 + 8e4ca06 commit a907843

File tree

5 files changed

+136
-0
lines changed

5 files changed

+136
-0
lines changed

contains-duplicate/seungseung88.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// 시간 복잡도: O(n) => 배열을 한 번만 순회하므로
2+
// 공간 복잡도: O(n) => 최악의 경우 모든 요소를 객체에 저장하므로
3+
const containsDuplicate = (nums) => {
4+
const indices = {};
5+
6+
// 배열을 한 번 순회
7+
for (let i = 0; i < nums.length; i += 1) {
8+
const num = nums[i];
9+
10+
// 아직 등장하지 않은 숫자라면 객체에 기록
11+
if (!indices[num]) {
12+
indices[num] = 1;
13+
} else {
14+
// 이미 등장한 숫자라면 중복이므로 true 반환
15+
return true;
16+
}
17+
}
18+
19+
// 중복이 없으면 false 반환
20+
return false;
21+
};

house-robber/seungseung88.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// 시간 복잡도: O(n) 한 번의 루프만 돎
2+
// 공간 복잡도: O(n) nums와 같은 길이의 dp배열 생성
3+
4+
const rob = (nums) => {
5+
if (nums.length === 0) return 0;
6+
if (nums.length === 1) return nums[0];
7+
8+
const dp = Array(nums.length - 1).fill(0);
9+
10+
dp[0] = nums[0];
11+
dp[1] = Math.max(nums[0], nums[1]);
12+
13+
for (let i = 2; i < nums.length; i += 1) {
14+
dp[i] = Math.max(nums[i] + dp[i - 2], dp[i - 1]);
15+
}
16+
17+
return dp[nums.length - 1];
18+
};
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* 시간복잡도: O(n)
3+
* - set.has() => O(1)
4+
* - while() => 최악의 경우 O(n)
5+
* 공간복잡도: new Set() => O(n)
6+
*/
7+
const longestConsecutive = (nums) => {
8+
// 빈 배열일 때 0 리턴
9+
if (nums.length === 0) return 0;
10+
11+
// 중복 제거
12+
const set = new Set(nums);
13+
14+
// 연속되는 숫자의 길이를 넣을 변수 설정
15+
let longest = 0;
16+
17+
set.forEach((v) => {
18+
// 일단 연속되는 배열에서는 가장 최솟값을 찾음
19+
if (!set.has(v - 1)) {
20+
let cnt = 1;
21+
// 연속되는 배열에서 가장 긴 배열을 저장
22+
while (set.has(v + cnt)) {
23+
cnt += 1;
24+
}
25+
longest = Math.max(longest, cnt);
26+
}
27+
});
28+
29+
return longest;
30+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* 시간 복잡도: O(n)
3+
* - nums 순회하며 map 생성 O(n)
4+
* - map 순회하며 bucket 생성 O(n)
5+
* - bucket 순회하며 결과 찾음 O(n)
6+
*
7+
* 공간 복잡도: O(n)
8+
* - map O(n)
9+
* - bucket O(n)
10+
* - result k
11+
*/
12+
const topKFrequent = (nums, k) => {
13+
// nums 요소 : 요소의 갯수
14+
const map = {};
15+
// 요소의 갯수 : Set{ nums 요소 }
16+
const bucket = [];
17+
18+
const result = [];
19+
20+
for (let i = 0; i < nums.length; i += 1) {
21+
if (map[nums[i]]) {
22+
map[nums[i]] += 1;
23+
} else {
24+
map[nums[i]] = 1;
25+
}
26+
}
27+
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+
}
35+
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;
43+
}
44+
45+
return result;
46+
};

two-sum/seungseung88.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// 배열을 한 번 도니 시간 복잡도 O(n)
2+
// 최악의 경우 nums의 크기 배열만큼 증가하므로 공간 복잡도는 O(n)
3+
4+
const twoSum = (nums, target) => {
5+
// {값: 인덱스} 형태로 저장
6+
const indicies = {};
7+
8+
for (let i = 0; i < nums.length; i += 1) {
9+
// 타겟값에서 현재 가리키는 숫자를 뺀 값을 저장
10+
const complement = target - nums[i];
11+
12+
// complement가 indicies안에 존재하면 해당 값을 반환
13+
if (complement in indicies) {
14+
const j = indicies[complement];
15+
return [j, i];
16+
}
17+
// 존재 하지 않으면 값과 인덱스 형태로 저장 ex> { 11: 0, 15: 1, 2: 2 }
18+
indicies[nums[i]] = i;
19+
console.log(indicies);
20+
}
21+
};

0 commit comments

Comments
 (0)