Skip to content

Commit 9c8fe48

Browse files
authored
Merge pull request #2079 from sujeong-dev/main
[sujeong-dev] WEEK 02 solutions
2 parents f41c56a + e52f5f9 commit 9c8fe48

File tree

4 files changed

+122
-0
lines changed

4 files changed

+122
-0
lines changed

3sum/sujeong-dev.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number[][]}
4+
*
5+
* 시간복잡도: 이중 for문으로 O(n^2)이긴한데 너무 오래걸림
6+
* 해설 확인해보기
7+
*/
8+
var threeSum = function (nums) {
9+
if (nums.every((num) => num === 0)) return [nums.slice(0, 3)];
10+
11+
const threeSet = new Set();
12+
for (let i = 0; i < nums.length - 2; i++) {
13+
const twoSet = new Set();
14+
for (let j = i + 1; j < nums.length; j++) {
15+
const findNum = -(nums[i] + nums[j]);
16+
if (twoSet.has(findNum)) {
17+
const triplet = [nums[i], nums[j], findNum].sort((a, b) => a - b);
18+
threeSet.add(triplet.join(','));
19+
}
20+
twoSet.add(nums[j]);
21+
}
22+
}
23+
return Array.from(threeSet, (k) => k.split(',').map(Number));
24+
};

climbing-stairs/sujeong-dev.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* @param {number} n
3+
* @return {number}
4+
*
5+
* 시간복잡도 계산
6+
* 메모이제이션으로 n번째에는 n번째에 대한 부분만 연산되므로 O(n)
7+
*
8+
* 공간복잡도 계산
9+
* memo배열에 n번째 연산값들이 각 인덱스에 할당되므로 O(n)
10+
d */
11+
12+
var climbStairs = function (n, memo = []) {
13+
if (memo[n] !== undefined) return memo[n];
14+
15+
if (n <= 1) return 1;
16+
17+
memo[n] = climbStairs(n - 1, memo) + climbStairs(n - 2, memo);
18+
19+
return memo[n];
20+
};
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number[]}
4+
5+
result[i] = (nums[0] * ... * nums[i-1]) * (nums[i+1] * nums[n-1])
6+
i=0 r[0]= 1
7+
i=1 r[1]= 1 * nums[0] = 1
8+
i=2 r[2]= 1 * nums[0] * nums[1] = 2
9+
i=3 r[3]= 1 * nums[0] * nums[1] * nums[2] = 6
10+
11+
i=0 r[0]=24
12+
i=1 r[1]= 1 * nums[3] * nums[2] = 12
13+
r=2 r[2]= 1 * nums[3] =4
14+
r=3 r[3]= 1
15+
16+
i=0 r[0]=1 * 24
17+
i=1 r[1]=1 * 12
18+
i=2 r[2]=2 * 4
19+
i=3 r[3]=6 * 1
20+
인덱스를 중심으로 왼쪽 구간 원소의 곱 * 오른쪽 구간 원소의 곱
21+
22+
시간복잡도 계산
23+
왼쪽 구간 for문 nums에 비례해서 연산
24+
오른쪽 구간 for문 nums에 비례해서 연산
25+
=> O(n)
26+
27+
공간복잡도 계산
28+
start, end 할당(출력공간인 resultArray배열은 추가공간에서 제외된다.)
29+
=> O(1)
30+
*/
31+
var productExceptSelf = function (nums) {
32+
let resultArray = Array(nums.length).fill(1);
33+
const n = nums.length;
34+
35+
let start = 1;
36+
for (let i = 1; i < n; i++) {
37+
start *= nums[i - 1];
38+
resultArray[i] = start;
39+
}
40+
41+
let end = 1;
42+
for (let i = n - 2; i >= 0; i--) {
43+
end *= nums[i + 1];
44+
resultArray[i] *= end;
45+
}
46+
47+
return resultArray;
48+
};

valid-anagram/sujeong-dev.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* @param {string} s
3+
* @param {string} t
4+
* @return {boolean}
5+
*
6+
* 시간복잡도 계산
7+
* 문자열 s 길이만큼 Map에 set => n
8+
* 문자열 t 길이만큼 Map에 set => n
9+
* 따라서 O(n)
10+
*
11+
* 공간복잡도 계산
12+
* 문자열 s, t의 길이만큼 Map에 할당되니까 O(n)
13+
*/
14+
var isAnagram = function (s, t) {
15+
if (s.length !== t.length) return false;
16+
17+
const frequencyMap = new Map();
18+
19+
for (const x of s) {
20+
frequencyMap.set(x, (frequencyMap.get(x) || 0) + 1);
21+
}
22+
23+
for (const y of t) {
24+
if (!frequencyMap.has(y)) return false;
25+
frequencyMap.set(y, frequencyMap.get(y) - 1);
26+
if (frequencyMap.get(y) === 0) frequencyMap.delete(y);
27+
}
28+
29+
return frequencyMap.size === 0;
30+
};

0 commit comments

Comments
 (0)