Skip to content

[uraflower] Week10 Solutions #1557

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions course-schedule/uraflower.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/**
* @param {number} numCourses
* @param {number[][]} prerequisites
* @return {boolean}
*/
const canFinish = function (numCourses, prerequisites) {
// 강의 간 관계 그래프 생성
const relation = Array.from({ length: numCourses }).map(() => new Set());
for (const [current, prev] of prerequisites) {
relation[current].add(prev);
}

const visiting = new Set(); // 수강할 수 있는지 확인하기 위해 순회중인 강의
const visited = new Set(); // 수강 가능한 강의

function dfs(current) {
if (visiting.has(current)) {
return false;
}
if (visited.has(current)) {
return true;
}
visiting.add(current);

for (const prev of relation[current]) {
if (visiting[prev] || !dfs(prev)) {
return false;
}
}

visiting.delete(current);
visited.add(current)

return true;
}

// 강의마다 순회
for (let i = 0; i < numCourses; i++) {
if (!visited[i] && !dfs(i)) {
return false;
}
}

return true;
};
26 changes: 26 additions & 0 deletions invert-binary-tree/uraflower.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/

/**
* 이진 트리를 좌우 반전하여 반환하는 함수
* @param {TreeNode} root
* @return {TreeNode}
*/
const invertTree = function (root) {
if (root !== null) {
invertTree(root.right);
invertTree(root.left);
[root.right, root.left] = [root.left, root.right];
}

return root;
};

// 시간복잡도: O(n)
// 공간복잡도: O(n)
27 changes: 27 additions & 0 deletions jump-game/uraflower.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* @param {number[]} nums
* @return {boolean}
*/
const canJump = function(nums) {
// 마지막 인덱스에서 첫 인덱스로 거꾸로 돌면서
// 필요한 점프 횟수를 변수에 저장
// 만약 인덱스 i의 값이 필요한 점프 횟수를 충족한다면 초기화

let need = 1;
let answer = true;

for (let i = nums.length - 2; i >= 0; i--) {
if (nums[i] >= need) {
need = 1;
answer = true;
} else {
need += 1;
answer = false;
}
}

return answer;
};

// 시간복잡도: O(n)
// 공간복잡도: O(1)
41 changes: 41 additions & 0 deletions search-in-rotated-sorted-array/uraflower.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/**
* 주어진 배열에서 타겟의 인덱스를 찾아 반환하는 함수
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
const search = function (nums, target) {
let left = 0;
let right = nums.length;
let mid = Math.floor((left + right) / 2);

while (left < right) {
mid = Math.floor((left + right) / 2);

if (nums[mid] === target) break;

// left부터 mid까지 잘 정렬되어 있는 경우 (=> rotate된 부분은 mid부터 right 사이에 있음)
if (nums[left] < nums[mid]) {
// 정렬된 left부터 mid 사이에 타겟이 있는 경우
if (nums[left] <= target && target <= nums[mid]) {
right = mid;
} else {
left = mid + 1;
}
}
// mid부터 right까지 잘 정렬되어 있는 경우 (=> rotate된 부분은 left부터 mid 사이에 있음)
else {
// 정렬된 mid부터 right 사이에 타겟이 있는 경우
if (nums[mid] <= target && target <= nums[right - 1]) {
left = mid;
} else {
right = mid;
}
}
}

return nums[mid] === target ? mid : -1;
};

// O(log n)
// O(1)