[JeonJe] WEEK 10 Solutions - #2837
Conversation
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
invert-binary-tree/JeonJe.java
import java.util.*;
// TC: O(n)
// SC: O(n)
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
return root;
}
}- ํจํด: Depth-First Search, Binary Search
- ์ค๋ช : ๋ฆฌํ๊น์ง ๊น์ด ํ์ํ๋ฉฐ ์์ชฝ ์์ ๋ ธ๋๋ฅผ ์๋ก ๊ตํํ๋ ์ฌ๊ท DFS ๋ฐฉ์์ผ๋ก ํธ๋ฆฌ๋ฅผ ๋ฐ์ ์ํต๋๋ค. ๊ฐ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํด ์ข์ฐ๋ฅผ ์ค์ํ๊ณ ํ์ ํธ๋ฆฌ๋ ๋์ผํ๊ฒ ์ฌ๊ท์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
โน๏ธ ์ด ํ์ผ์๋ 2๊ฐ์ง ํ์ด๊ฐ ํฌํจ๋์ด ์์ด ๊ฐ๊ฐ ๋ถ์ํฉ๋๋ค.
ํ์ด 1: Solution.invertTree โ Time: โ
O(n) โ O(n) / Space: โ O(n) โ O(h)
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(n) | O(n) | โ |
| Space | O(n) | O(h) | โ |
ํผ๋๋ฐฑ: ํธ๋ฆฌ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ฉฐ ๊ฐ ๋ ธ๋์ ์ข์ฐ ์์ ํฌ์ธํฐ๋ฅผ ๊ตํํ๋ค. ์ฌ๊ท ๊น์ด๋ ํธ๋ฆฌ์ ๋์ด์ ๋ฐ๋ผ ๊ณต๊ฐ์ด ๊ฒฐ์ ๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
ํ์ด 2: Solution.invertTree โ Time: โ
O(n) โ O(n) / Space: โ O(n) โ O(h)
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(n) | O(n) | โ |
| Space | O(n) | O(h) | โ |
ํผ๋๋ฐฑ: ๋ชจ๋ ๋ ธ๋๋ฅผ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๊ณ ํฌ์ธํฐ๋ฅผ ์ค์ํ๋ฏ๋ก ์๊ฐ์ ์ ํ, ์ฌ๊ท ์คํ์ ํธ๋ฆฌ์ ๋์ด์ ๋น๋กํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ JeonJe ๋์ ํ์ต ํํฉ์ด๋ฒ ์ฃผ ์ ์ถ ๋ฌธ์
๋์ ํ์ต ์์ฝ
๋ฌธ์ ํ์ด ํํฉ
๐ค ์ด ๋๊ธ์ GitHub App์ ํตํด ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค. ๐ข API ์ฌ์ฉ๋ (gpt-5-nano)
|
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
search-in-rotated-sorted-array/JeonJe.java
import java.util.*;
// TC: O(log n)
// SC: O(1)
class Solution {
public int search(int[] nums, int target) {
int pivot = findRotationPoint(nums);
if (pivot > 0 && target >= nums[0]) {
return binarySearch(nums, target, 0, pivot - 1);
}
return binarySearch(nums, target, pivot, nums.length - 1);
}
private int findRotationPoint(int[] nums) {
int lo = 0;
int hi = nums.length - 1;
while (lo < hi) {
if (nums[lo] < nums[hi]) {
return lo;
}
int mid = (lo + hi) / 2;
if (nums[lo] <= nums[mid]) {
lo = mid + 1;
} else {
hi = mid;
}
}
return lo;
}
private int binarySearch(int[] nums, int target, int lo, int hi) {
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] < target) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
return -1;
}
}- ํจํด: Binary Search, Divide and Conquer
- ์ค๋ช : ๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ด์ง ํ์์ผ๋ก ํ๊น์ ์ฐพ๋ ๊ตฌ์กฐ์ด๋ฉฐ, ํ์ ๋ ๋ฐฐ์ด์์ ํผ๋ฒ์ ์ฐพ์ ๊ตฌ๊ฐ์ ๋๋ ์ด์ง ํ์์ ์ํํ๋ ํจํด์ด๋ค. ๋ฐ๋ผ์ Binary Search์ Divide and Conquer์ ํด๋นํ๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(log n) | O(log n) | โ |
| Space | O(1) | O(1) | โ |
ํผ๋๋ฐฑ: ํผ๋ด ์ฐพ๊ธฐ์ ์ด์งํ์์ผ๋ก ์ ์ฒด ๋ณต์ก๋๋ฅผ ๋ก๊ทธ์ค์ผ์ผ๋ก ์ ์งํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
There was a problem hiding this comment.
ํผ๋ด ํฌ์ธํธ๋ฅผ ์ฐพ์์ ํ๋๊ฒ๋ ๊ฝค ์ข์ ์์ด๋์ด์๋ค์!
๋ค๋ง ํ๋ฒ์ binary search๋ก ํด๊ฒฐํ์ท์๋ ์์ด์!
There was a problem hiding this comment.
๋ง์ํด์ฃผ์ ์ ์์ ์๊ฐํด๋ณด๋, mid๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ๊ตฌ๊ฐ์ ํ์ธํ๊ณ
ํ๊น์ด ํด๋น ๋ฒ์์ ์๋์ง์ ๋ฐ๋ผ ํ์ ๋ฒ์๋ฅผ ์ค์ฌ๊ฐ๋ ๋ฐฉ์์ผ๋ก
ํผ๋ฒ ์์น๋ฅผ ๋จผ์ ๊ตฌํ์ง ์๊ณ ๋ ํ ๋ฒ์ ์ด์ง ํ์์ผ๋ก ํด๊ฒฐํ ์ ์์๋ค์. ๊ฐ์ฌํฉ๋๋ค!
| invertTree(root.left); | ||
| invertTree(root.right); |
There was a problem hiding this comment.
ํด๋น ๋ ๋ถ๋ถ์ด ๊ฐ๊ฐ์ ์๋ธํธ๋ฆฌ๋ฅผ ๋ฆฌํดํ๋๊น ์ด๊ฑธ ๊ทธ๋๋ก ์ฌ์ฉํด์ root.left์ root.right์ ๋ฃ์ด๋ ์ข์ง ์์๊น ํ๋ ์๊ฐ์ด ์์ต๋๋ค!
There was a problem hiding this comment.
๋ฐํ๋ ์๋ธํธ๋ฆฌ๋ฅผ root.left์ root.right์ ๋ค์ ๋ฃ์์ง ๊ณ ๋ฏผํ๋๋ฐ,
๊ฐ ์๋ธํธ๋ฆฌ๋ฅผ ์ ์๋ฆฌ์์ ๋ณ๊ฒฝํ๋ฏ๋ก ๋ค์ ๋์
ํ์ง ์๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ต๋๋ค.
์๋๋ฅผ ๋ ๋ช
ํํ๊ฒ ํํํ ์ ์๋ ์ ์ ๊ฐ์ฌํฉ๋๋ค!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
course-schedule/JeonJe.java
import java.util.ArrayList;
import java.util.List;
// TC: O(V + E)
// SC: O(V + E)
class Solution {
private static final int UNVISITED = 0;
private static final int VISITING = 1;
private static final int VISITED = 2;
public boolean canFinish(int numCourses, int[][] prerequisites) {
List<List<Integer>> nextCourses = new ArrayList<>(numCourses);
int[] visitState = new int[numCourses];
for (int course = 0; course < numCourses; course++) {
nextCourses.add(new ArrayList<>());
}
for (int[] dependency : prerequisites) {
int course = dependency[0];
int prerequisite = dependency[1];
nextCourses.get(prerequisite).add(course);
}
for (int course = 0; course < numCourses; course++) {
if (visitState[course] == UNVISITED
&& hasCycle(course, nextCourses, visitState)) {
return false;
}
}
return true;
}
private boolean hasCycle(
int course,
List<List<Integer>> nextCourses,
int[] visitState
) {
if (visitState[course] == VISITING) {
return true;
}
if (visitState[course] == VISITED) {
return false;
}
visitState[course] = VISITING;
for (int nextCourse : nextCourses.get(course)) {
if (hasCycle(nextCourse, nextCourses, visitState)) {
return true;
}
}
visitState[course] = VISITED;
return false;
}
}- ํจํด: Depth-First Search, Greedy
- ์ค๋ช : ์ฝ๋์์ DFS๋ฅผ ์ฌ์ฉํด ์์ ๊ทธ๋ํ์ ์ฌ์ดํด ์ฌ๋ถ๋ฅผ ํ์งํฉ๋๋ค. ๋ฐฉ๋ฌธ ์ํ๋ฅผ ์ถ์ ํ๋ฉฐ ์ฌ์ดํด์ด ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๊ณ , ์ฌ์ดํด์ด ์์ผ๋ฉด ๊ฐ๋ฅํ๋ค๊ณ ํ๋จํฉ๋๋ค. ์์ ์ ๋ ฌ-์ฌ์ดํด ํ๋ณ์ ๋ํ ํจํด์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
โน๏ธ ์ด ํ์ผ์๋ 2๊ฐ์ง ํ์ด๊ฐ ํฌํจ๋์ด ์์ด ๊ฐ๊ฐ ๋ถ์ํฉ๋๋ค.
ํ์ด 1: Solution.canFinish โ Time: โ
O(V + E) โ O(V + E) / Space: โ
O(V + E) โ O(V + E)
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(V + E) | O(V + E) | โ |
| Space | O(V + E) | O(V + E) | โ |
ํผ๋๋ฐฑ: ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ๋ก ํํํ๊ณ DFS๋ก ์ฌ์ดํด ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ค. ๊ฐ ๋ ธ๋๋ ํ ๋ฒ๋ง ๋ฐฉ๋ฌธํ๋ฏ๋ก ์ ์ฒด ์๊ฐ์ ์ ์ /๊ฐ์ ์ ํฉ์ ๋น๋กํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
ํ์ด 2: Solution.hasCycle โ Time: O(V + E) / Space: O(V + E)
| ๋ณต์ก๋ | |
|---|---|
| Time | O(V + E) |
| Space | O(V + E) |
ํผ๋๋ฐฑ: ๊ฐ ๋ ธ๋์ ๋ฐฉ๋ฌธ ์ํ๋ฅผ ์ธ ๊ฐ์ง๋ก ๊ด๋ฆฌํ์ฌ ์ฌ์ดํด์ ๊ฒ์ถํ๋ค. ์ฌ๊ท ๊น์ด์ ์ฃผ์ ํ์.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
๋ต์ ์ ์ถ ๋ฌธ์
์์ฑ์ ์ฒดํฌ ๋ฆฌ์คํธ
In Review๋ก ์ค์ ํด์ฃผ์ธ์.๊ฒํ ์ ์ฒดํฌ ๋ฆฌ์คํธ
Important
๋ณธ์ธ ๋ต์ ์ ์ถ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ถ PR ํ๋ ์ด์์ ๋ฐ๋์ ๊ฒํ ๋ฅผ ํด์ฃผ์ ์ผ ํฉ๋๋ค!