Skip to content

Commit 7f318e0

Browse files
authored
Merge pull request #1549 from Tessa1217/main
[Tessa1217] Week 10 Solutions
2 parents f5c36f7 + 66b88c9 commit 7f318e0

File tree

5 files changed

+289
-0
lines changed

5 files changed

+289
-0
lines changed

course-schedule/Tessa1217.java

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import java.util.ArrayList;
2+
import java.util.LinkedList;
3+
import java.util.List;
4+
import java.util.Queue;
5+
6+
class Solution {
7+
public boolean canFinish(int numCourses, int[][] prerequisites) {
8+
// return BFS(numCourses, prerequisites);
9+
return DFS(numCourses, prerequisites);
10+
}
11+
12+
// BFS 방식으로 풀이
13+
private boolean BFS(int numCourses, int[][] prerequisites) {
14+
15+
// 연결 그래프 생성
16+
List<List<Integer>> graph = new ArrayList<>();
17+
for (int i = 0; i < numCourses; i++) {
18+
graph.add(new ArrayList<>());
19+
}
20+
21+
// 들어오는 간선의 수 배열
22+
int[] inDegree = new int[numCourses];
23+
24+
for (int[] pre : prerequisites) {
25+
int course = pre[0];
26+
int prereq = pre[1];
27+
inDegree[course]++;
28+
graph.get(prereq).add(course);
29+
}
30+
31+
// 들어오는 간선이 없는 과목 Queue에 삽입
32+
Queue<Integer> q = new LinkedList<>();
33+
for (int i = 0; i < inDegree.length; i++) {
34+
if (inDegree[i] == 0) {
35+
q.offer(i);
36+
}
37+
}
38+
39+
// 들은 과목 수
40+
int takeCourse = 0;
41+
while (!q.isEmpty()) {
42+
int course = q.poll();
43+
takeCourse++;
44+
45+
for (int connect : graph.get(course)) {
46+
inDegree[connect]--;
47+
if (inDegree[connect] == 0) {
48+
q.offer(connect);
49+
}
50+
}
51+
}
52+
53+
return takeCourse == numCourses;
54+
}
55+
56+
// DFS 방식 풀이
57+
private boolean DFS(int numCourses, int[][] prerequisites) {
58+
List<List<Integer>> graph = new ArrayList<>();
59+
for (int i = 0; i < numCourses; i++) {
60+
graph.add(new ArrayList<>());
61+
}
62+
63+
for (int[] pre : prerequisites) {
64+
int course = pre[0];
65+
int prereq = pre[1];
66+
graph.get(prereq).add(course);
67+
}
68+
69+
// 처리 상태 배열
70+
int[] state = new int[numCourses];
71+
72+
for (int i = 0; i < numCourses; i++) {
73+
if (hasCycle(graph, state, i)) {
74+
return false;
75+
}
76+
}
77+
78+
return true;
79+
}
80+
81+
// 사이클 여부 확인
82+
private boolean hasCycle(List<List<Integer>> graph, int[] state, int course) {
83+
84+
if (state[course] == 1) return true; // 사이클이 있다면
85+
if (state[course] == 2) return false; // 이미 처리 완료되었으므로 return
86+
87+
state[course] = 1;
88+
for (int connect : graph.get(course)) {
89+
if (hasCycle(graph, state, connect)) {
90+
return true;
91+
}
92+
}
93+
state[course] = 2; // 처리 완료
94+
return false;
95+
}
96+
}
97+

invert-binary-tree/Tessa1217.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode() {}
8+
* TreeNode(int val) { this.val = val; }
9+
* TreeNode(int val, TreeNode left, TreeNode right) {
10+
* this.val = val;
11+
* this.left = left;
12+
* this.right = right;
13+
* }
14+
* }
15+
*/
16+
/**
17+
* 이진 트리의 root가 주어질 때 이진 트리를 뒤바꾼 후 root를 반환하세요.
18+
*/
19+
class Solution {
20+
public TreeNode invertTree(TreeNode root) {
21+
22+
if (root == null) {
23+
return root;
24+
}
25+
26+
TreeNode current = root;
27+
28+
// 좌우 변경
29+
TreeNode temp = current.left;
30+
current.left = invertTree(current.right);
31+
current.right = invertTree(temp);
32+
33+
return root;
34+
}
35+
}
36+

jump-game/Tessa1217.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
3+
// 시간 복잡도: O(N), 공간복잡도: O(1)
4+
public boolean canJump(int[] nums) {
5+
6+
int maxJump = 0;
7+
for (int i = 0; i < nums.length; i++) {
8+
// 최대 점프수로 현재 인덱스에 도달할 수 없다면
9+
if (i > maxJump) {
10+
return false;
11+
}
12+
maxJump = Math.max(maxJump, i + nums[i]);
13+
if (maxJump >= nums.length - 1) {
14+
return true;
15+
}
16+
}
17+
18+
return true;
19+
20+
}
21+
}
22+
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import java.util.PriorityQueue;
2+
3+
/**
4+
* Definition for singly-linked list.
5+
* public class ListNode {
6+
* int val;
7+
* ListNode next;
8+
* ListNode() {}
9+
* ListNode(int val) { this.val = val; }
10+
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
11+
* }
12+
*/
13+
class Solution {
14+
15+
// 우선순위 큐를 활용
16+
// 시간복잡도: O(N log k)
17+
public ListNode mergeKLists(ListNode[] lists) {
18+
if (lists == null || lists.length == 0) {
19+
return null;
20+
}
21+
22+
// 우선순위 큐 생성
23+
PriorityQueue<ListNode> pqueue = new PriorityQueue<>(
24+
(a, b) -> Integer.compare(a.val, b.val)
25+
);
26+
27+
// 첫번째 노드를 우선순위 큐에 삽입
28+
for (ListNode node : lists) {
29+
if (node != null) {
30+
pqueue.offer(node);
31+
}
32+
}
33+
34+
ListNode temp = new ListNode(-1);
35+
ListNode current = temp;
36+
37+
// 꺼낸 노드의 다음노드가 있으면 큐에 넣는 것을 반복
38+
while (!pqueue.isEmpty()) {
39+
ListNode node = pqueue.poll();
40+
current.next = node;
41+
current = current.next;
42+
43+
if (node.next != null) {
44+
pqueue.offer(node.next);
45+
}
46+
}
47+
48+
return temp.next;
49+
}
50+
51+
// 시간복잡도: O(N log K)
52+
// public ListNode mergeKLists(ListNode[] lists) {
53+
// if (lists == null || lists.length == 0) {
54+
// return null;
55+
// }
56+
57+
// return mergeKLists(lists, 0, lists.length - 1);
58+
59+
// }
60+
61+
// 단계마다 left, right로 나누어 리스트 병합
62+
// private ListNode mergeKLists(ListNode[] lists, int start, int end) {
63+
64+
// if (start == end) {
65+
// return lists[start];
66+
// }
67+
68+
// int mid = start + (end - start) / 2;
69+
70+
// ListNode left = mergeKLists(lists, start, mid);
71+
// ListNode right = mergeKLists(lists, mid + 1, end);
72+
73+
// return mergeLists(left, right);
74+
// }
75+
76+
// 두 개의 노드에 대해 노드의 값 비교하여 ListNode에 연결하여 하나로 병합
77+
// private ListNode mergeLists(ListNode node1, ListNode node2) {
78+
// ListNode temp = new ListNode(-1);
79+
// ListNode current = temp;
80+
81+
// while (node1 != null && node2 != null) {
82+
// if (node1.val < node2.val) {
83+
// current.next = node1;
84+
// node1 = node1.next;
85+
// } else {
86+
// current.next = node2;
87+
// node2 = node2.next;
88+
// }
89+
// current = current.next;
90+
// }
91+
92+
// if (node1 != null) current.next = node1;
93+
// if (node2 != null) current.next = node2;
94+
95+
// return temp.next;
96+
// }
97+
98+
}
99+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution {
2+
3+
// 이진 탐색: 시간복잡도: O(log n)
4+
public int search(int[] nums, int target) {
5+
6+
int left = 0;
7+
int right = nums.length - 1;
8+
9+
while (left <= right) {
10+
11+
int mid = left + (right - left)/2;
12+
13+
if (nums[mid] == target) {
14+
return mid;
15+
}
16+
17+
// 구간 설정
18+
if (nums[left] <= nums[mid]) {
19+
if (nums[left] <= target && target < nums[mid]) {
20+
right = mid - 1;
21+
} else {
22+
left = mid + 1;
23+
}
24+
} else {
25+
if (nums[mid] < target && target <= nums[right]) {
26+
left = mid + 1;
27+
} else {
28+
right = mid - 1;
29+
}
30+
}
31+
}
32+
33+
return -1;
34+
}
35+
}

0 commit comments

Comments
 (0)