Skip to content

Commit edf4e96

Browse files
authored
Merge pull request #1557 from uraflower/main
[uraflower] Week10 Solutions
2 parents 5880bd8 + a78b234 commit edf4e96

File tree

5 files changed

+184
-0
lines changed

5 files changed

+184
-0
lines changed

course-schedule/uraflower.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* @param {number} numCourses
3+
* @param {number[][]} prerequisites
4+
* @return {boolean}
5+
*/
6+
const canFinish = function (numCourses, prerequisites) {
7+
// 강의 간 관계 그래프 생성
8+
const relation = Array.from({ length: numCourses }).map(() => new Set());
9+
for (const [current, prev] of prerequisites) {
10+
relation[current].add(prev);
11+
}
12+
13+
const visiting = new Set(); // 수강할 수 있는지 확인하기 위해 순회중인 강의
14+
const visited = new Set(); // 수강 가능한 강의
15+
16+
function dfs(current) {
17+
if (visiting.has(current)) {
18+
return false;
19+
}
20+
if (visited.has(current)) {
21+
return true;
22+
}
23+
visiting.add(current);
24+
25+
for (const prev of relation[current]) {
26+
if (visiting[prev] || !dfs(prev)) {
27+
return false;
28+
}
29+
}
30+
31+
visiting.delete(current);
32+
visited.add(current)
33+
34+
return true;
35+
}
36+
37+
// 강의마다 순회
38+
for (let i = 0; i < numCourses; i++) {
39+
if (!visited[i] && !dfs(i)) {
40+
return false;
41+
}
42+
}
43+
44+
return true;
45+
};

invert-binary-tree/uraflower.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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+
/**
11+
* 이진 트리를 좌우 반전하여 반환하는 함수
12+
* @param {TreeNode} root
13+
* @return {TreeNode}
14+
*/
15+
const invertTree = function (root) {
16+
if (root !== null) {
17+
invertTree(root.right);
18+
invertTree(root.left);
19+
[root.right, root.left] = [root.left, root.right];
20+
}
21+
22+
return root;
23+
};
24+
25+
// 시간복잡도: O(n)
26+
// 공간복잡도: O(n)

jump-game/uraflower.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {boolean}
4+
*/
5+
const canJump = function(nums) {
6+
// 마지막 인덱스에서 첫 인덱스로 거꾸로 돌면서
7+
// 필요한 점프 횟수를 변수에 저장
8+
// 만약 인덱스 i의 값이 필요한 점프 횟수를 충족한다면 초기화
9+
10+
let need = 1;
11+
let answer = true;
12+
13+
for (let i = nums.length - 2; i >= 0; i--) {
14+
if (nums[i] >= need) {
15+
need = 1;
16+
answer = true;
17+
} else {
18+
need += 1;
19+
answer = false;
20+
}
21+
}
22+
23+
return answer;
24+
};
25+
26+
// 시간복잡도: O(n)
27+
// 공간복잡도: O(1)

merge-k-sorted-lists/uraflower.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val, next) {
4+
* this.val = (val===undefined ? 0 : val)
5+
* this.next = (next===undefined ? null : next)
6+
* }
7+
*/
8+
/**
9+
* @param {ListNode[]} lists
10+
* @return {ListNode}
11+
*/
12+
const mergeKLists = function (lists) {
13+
// 각 노드의 val 별 개수를 객체로 나타냄
14+
const counter = {};
15+
16+
for (let list of lists) {
17+
let node = list;
18+
while (node) {
19+
counter[node.val] = (counter[node.val] || 0) + 1;
20+
node = node.next;
21+
}
22+
}
23+
24+
// 위에서 만든 객체를 오름차순으로 순회하면서 node와 list를 생성
25+
let head = new ListNode();
26+
let current = head;
27+
const entries = Object.entries(counter).sort(([val1], [val2]) => Number(val1) - Number(val2)); // val 기준 오름차순 정렬
28+
29+
for (let i = 0; i < entries.length; i++) {
30+
const [val, count] = entries[i];
31+
32+
for (let j = 0; j < count; j++) {
33+
const node = new ListNode(Number(val));
34+
current.next = node;
35+
current = current.next;
36+
}
37+
}
38+
39+
return head.next;
40+
};
41+
42+
// 시간복잡도: O(n * log n) (sort에서 n * log n, 순회와 리스트 구성에서는 n)
43+
// 공간복잡도: O(n)
44+
45+
// 최소힙을 통해 최적화를 할 수 있음
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* 주어진 배열에서 타겟의 인덱스를 찾아 반환하는 함수
3+
* @param {number[]} nums
4+
* @param {number} target
5+
* @return {number}
6+
*/
7+
const search = function (nums, target) {
8+
let left = 0;
9+
let right = nums.length;
10+
let mid = Math.floor((left + right) / 2);
11+
12+
while (left < right) {
13+
mid = Math.floor((left + right) / 2);
14+
15+
if (nums[mid] === target) break;
16+
17+
// left부터 mid까지 잘 정렬되어 있는 경우 (=> rotate된 부분은 mid부터 right 사이에 있음)
18+
if (nums[left] < nums[mid]) {
19+
// 정렬된 left부터 mid 사이에 타겟이 있는 경우
20+
if (nums[left] <= target && target <= nums[mid]) {
21+
right = mid;
22+
} else {
23+
left = mid + 1;
24+
}
25+
}
26+
// mid부터 right까지 잘 정렬되어 있는 경우 (=> rotate된 부분은 left부터 mid 사이에 있음)
27+
else {
28+
// 정렬된 mid부터 right 사이에 타겟이 있는 경우
29+
if (nums[mid] <= target && target <= nums[right - 1]) {
30+
left = mid;
31+
} else {
32+
right = mid;
33+
}
34+
}
35+
}
36+
37+
return nums[mid] === target ? mid : -1;
38+
};
39+
40+
// O(log n)
41+
// O(1)

0 commit comments

Comments
 (0)