Skip to content

Commit 1450d8d

Browse files
authored
Merge pull request #1752 from jangwonyoon/main
[jangwonyoon] Week 02 solutions
2 parents 519faa0 + e9f850f commit 1450d8d

File tree

5 files changed

+199
-0
lines changed

5 files changed

+199
-0
lines changed

3sum/jangwonyoon.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number[][]}
4+
*
5+
* 1. 투포인터를 사용하기 위해 정렬
6+
* 2. 투포인터를 사용하여 합이 0인 경우 추가
7+
* 3. 중복 된 값 스킵
8+
*
9+
* 시간 복잡도: O(n^2)
10+
* 공간 복잡도: O(K + kLogK) (K: 결과 배열의 크기, kLogK: 정렬 공간)
11+
*/
12+
/**
13+
* @param {number[]} nums
14+
* @return {number[][]}
15+
*/
16+
var threeSum = function(nums) {
17+
const arr = [];
18+
19+
// 투포인터를 사용하기 위해 정렬
20+
nums.sort((a, b) => a - b);
21+
22+
for (let i = 0; i < nums.length - 2; i++) {
23+
// 중복 된 값 스킵
24+
if (i > 0 && nums[i] === nums[i - 1]) continue;
25+
26+
let left = i + 1;
27+
let right = nums.length - 1;
28+
29+
while (left < right) {
30+
const sum = nums[i] + nums[left] + nums[right];
31+
32+
if (sum === 0) {
33+
arr.push([nums[i], nums[left], nums[right]]);
34+
35+
// 중복 된 값 스킵
36+
while (left < right && nums[left] === nums[left + 1]) left++;
37+
while (left < right && nums[right] === nums[right - 1]) right--;
38+
39+
left++;
40+
right--;
41+
} else if (sum > 0) {
42+
right--;
43+
} else {
44+
left++;
45+
}
46+
}
47+
}
48+
49+
return arr;
50+
};

climbing-stairs/jangwonyoon.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* @param {number} n
3+
* @return {number}
4+
* 점화식: f(n) = f(n-1) + f(n-2)
5+
* 초기값: f(1) = 1, f(2) = 2
6+
* 시간 복잡도: O(n)
7+
* 공간 복잡도: O(1)
8+
*/
9+
10+
var climbStairs = function(n) {
11+
// 초기값 처리
12+
if (n === 1) return 1;
13+
if (n === 2) return 2;
14+
15+
let prev = 1;
16+
let curr = 2;
17+
18+
// 점화식 계산
19+
for (let i = 3; i <= n; i++) {
20+
const next = prev + curr;
21+
prev = curr;
22+
curr = next;
23+
}
24+
25+
return curr;
26+
};
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* 본인을 기준으로 좌측과, 우측 나눠서 곱한다.
3+
* 담아놓을 변수를 놓고 진행한다.
4+
* @param {number[]} nums
5+
* @return {number[]}
6+
*
7+
* 시간 복잡도: O(n)
8+
* 공간 복잡도: O(n)
9+
*/
10+
var productExceptSelf = function(nums) {
11+
const n = nums.length;
12+
const left = Array(n).fill(1);
13+
const right = Array(n).fill(1);
14+
const res = Array(n);
15+
16+
// 좌측 곱
17+
for (let i = 1; i < n; i++) {
18+
left[i] = nums[i - 1] * left[i - 1];
19+
}
20+
21+
// 우측 곱
22+
for (let i = n - 2; i >= 0; i--) {
23+
right[i] = nums[i + 1] * right[i + 1];
24+
}
25+
26+
for (let i = 0; i < n; i++) {
27+
res[i] = left[i] * right[i];
28+
}
29+
30+
return res;
31+
};

valid-anagram/jangwonyoon.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* @param {string} s
3+
* @param {string} t
4+
* @return {boolean}
5+
*/
6+
7+
/**
8+
* 유니크한 값만 확인한다.
9+
* 1. core: Map 사용하고, 모든 string을 할당한다.
10+
* 2. string을 순회해서 할당한다.
11+
* 3. map에 요소가 있으면 있으면 + 1, 없으면 1
12+
* 4. map을 순회해서 요소가 있다면 -1을 해준다.
13+
* 5. HashMap을 다시 한번 순회해서, 1이상 값이 있다면 유니크한 값이 아니기 때문에 false, HashMap의 모든 값들이 0이면 true
14+
15+
* 공간복잡도 O(N)
16+
* 시간복잡도 O(N)
17+
*/
18+
19+
20+
var isAnagram = function(s, t) {
21+
const hashMap = new Map();
22+
23+
// 예외 처리
24+
if (s.length !== t.length) {
25+
return false;
26+
}
27+
28+
29+
for (const string of s) {
30+
if (!hashMap.has(string)) {
31+
hashMap.set(string, 1)
32+
} else {
33+
hashMap.set(string, hashMap.get(string) + 1)
34+
}
35+
}
36+
37+
for (const string of t) {
38+
if (hashMap.has(string)) {
39+
hashMap.set(string, hashMap.get(string) - 1);
40+
}
41+
}
42+
43+
// 0이 아닌 값이 있는경우 - false
44+
for (const [key , value] of hashMap) {
45+
// early return
46+
if (value > 0) return false;
47+
}
48+
49+
return true;
50+
};
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val, left, right) {
4+
* this.val = (val===undefined ? 0 : val)
5+
* this.left = (left===undefined ? null : left)
6+
* this.right = (right===undefined ? null : right)
7+
* }
8+
*/
9+
/**
10+
* @param {TreeNode} root
11+
* @return {boolean}
12+
*
13+
* DFS를 사용하여 왼쪽 노드와 오른쪽 노드를 검증한다.
14+
*
15+
* 시간 복잡도: O(n)
16+
* 공간 복잡도: O(n)
17+
*/
18+
var isValidBST = function(root) {
19+
const MAX_VALUE = Infinity;
20+
const MIN_VALUE = -Infinity;
21+
22+
const validate = (node, min, max) => {
23+
// 재귀 탈출 조건
24+
if (!node) return true;
25+
26+
// 예외 처리 - 현재 노드의 값이 최소값보다 작거나 최대값보다 크면 예외 처리
27+
if (node.val <= min || node.val >= max) return false;
28+
29+
const leftNode = node.left;
30+
const rightNode = node.right;
31+
32+
// 왼쪽 노드 검증 - 현재 값이 제일 크고, 왼쪽은 본인보다 작아야한다.
33+
const validateLeftNode = validate(leftNode, min , node.val);
34+
35+
// 오른쪽 노드 검증 - 현재 값이 제일 작으며, 우측 노드 값이 본인 보다 커야한다.
36+
const validateRightNode = validate(rightNode, node.val, max)
37+
38+
return validateLeftNode && validateRightNode;
39+
}
40+
41+
return validate(root, MIN_VALUE, MAX_VALUE);
42+
};

0 commit comments

Comments
 (0)