Skip to content

Commit 2680b07

Browse files
authored
Merge pull request #1616 from Tessa1217/main
[Tessa1217] Week 13 Solutions
2 parents 95bed90 + fa8a839 commit 2680b07

File tree

5 files changed

+211
-0
lines changed

5 files changed

+211
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import java.util.PriorityQueue;
2+
3+
class MedianFinder {
4+
5+
// 작은 수 범위 저장하는 힙
6+
private PriorityQueue<Integer> smallHeap;
7+
8+
// 큰 수 범위 저장하는 힙
9+
private PriorityQueue<Integer> largeHeap;
10+
11+
public MedianFinder() {
12+
smallHeap = new PriorityQueue<>((a, b) -> b - a);
13+
largeHeap = new PriorityQueue<> ((a, b) -> a - b);
14+
}
15+
16+
public void addNum(int num) {
17+
// 작은 수 범위에 삽입
18+
smallHeap.offer(num);
19+
// 작은 수 범위에서 최댓값을 뽑아 큰 수 범위로 이동
20+
largeHeap.offer(smallHeap.poll());
21+
22+
// 만약 작은 수 범위의 개수가 큰 수 범위보다 작다면
23+
if (smallHeap.size() < largeHeap.size()) {
24+
// 큰 수 범위에서 최솟값을 뽑아 작은 수 범위로 이동
25+
smallHeap.offer(largeHeap.poll());
26+
}
27+
}
28+
29+
public double findMedian() {
30+
// 짝수 개일 경우
31+
if (smallHeap.size() == largeHeap.size()) {
32+
// 작은 수 범위 힙의 최댓값 + 큰 수 범위 힙의 최솟값의 평균
33+
return (smallHeap.peek() + largeHeap.peek()) / 2.0;
34+
}
35+
// 작은 수 범위 힙의 최댓값
36+
return smallHeap.peek();
37+
}
38+
}
39+
40+
/**
41+
* Your MedianFinder object will be instantiated and called as such:
42+
* MedianFinder obj = new MedianFinder();
43+
* obj.addNum(num);
44+
* double param_2 = obj.findMedian();
45+
*/
46+

insert-interval/Tessa1217.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import java.util.ArrayList;
2+
import java.util.List;
3+
4+
class Solution {
5+
6+
// 시간, 공간복잡도: O(n)
7+
public int[][] insert(int[][] intervals, int[] newInterval) {
8+
9+
// 병합된 interval 담는 list
10+
List<int[]> modifyIntervals = new ArrayList<>();
11+
12+
int idx = 0;
13+
14+
// 병합 이전 구간
15+
while (idx < intervals.length && intervals[idx][1] < newInterval[0]) {
16+
modifyIntervals.add(intervals[idx]);
17+
idx++;
18+
}
19+
20+
// 병합이 필요한 구간 (newInterval과 겹치는 구간)
21+
while (idx < intervals.length && intervals[idx][0] <= newInterval[1]) {
22+
newInterval[0] = Math.min(intervals[idx][0], newInterval[0]);
23+
newInterval[1] = Math.max(intervals[idx][1], newInterval[1]);
24+
idx++;
25+
}
26+
27+
// 최종 병합된 새로운 interval add
28+
modifyIntervals.add(newInterval);
29+
30+
// 병합 이후 구간
31+
while (idx < intervals.length) {
32+
modifyIntervals.add(intervals[idx]);
33+
idx++;
34+
}
35+
36+
return modifyIntervals.toArray(new int[modifyIntervals.size()][2]);
37+
}
38+
}
39+
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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+
class Solution {
17+
18+
private int count = 0;
19+
20+
private int kthSmallValue = 0;
21+
22+
// 시간복잡도: O(k) (불균형 상태의 이진 트리일 경우 O(n))
23+
public int kthSmallest(TreeNode root, int k) {
24+
orderSearch(root, k);
25+
return kthSmallValue;
26+
}
27+
28+
// In Order Search
29+
private void orderSearch(TreeNode node, int k) {
30+
31+
if (node == null) {
32+
return;
33+
}
34+
35+
// HINT => utilize the property of a BST => 좌측 리프 노드부터 탐색
36+
orderSearch(node.left, k);
37+
38+
count++;
39+
40+
if (count == k) {
41+
kthSmallValue = node.val;
42+
return;
43+
}
44+
45+
// search right side
46+
orderSearch(node.right, k);
47+
48+
}
49+
50+
}
51+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode(int x) { val = x; }
8+
* }
9+
*/
10+
class Solution {
11+
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
12+
13+
if (root == null || root == p || root == q) {
14+
return root;
15+
}
16+
17+
// 재귀로 좌측과 우측 탐색
18+
TreeNode left = lowestCommonAncestor(root.left, p, q);
19+
20+
TreeNode right = lowestCommonAncestor(root.right, p, q);
21+
22+
// 좌우 둘 다 null이 아니라면: 현재 root를 조상으로 하는 서브 트리에서 p와 q를 발견했음을 의미하므로 root가 공통 조상
23+
if (left != null && right != null) {
24+
return root;
25+
} else if (left != null) {
26+
return left;
27+
} else {
28+
return right;
29+
}
30+
31+
}
32+
}
33+

meeting-rooms/Tessa1217.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import java.util.Collections;
2+
import java.util.List;
3+
4+
/**
5+
* Definition of Interval:
6+
* public class Interval {
7+
* int start, end;
8+
* Interval(int start, int end) {
9+
* this.start = start;
10+
* this.end = end;
11+
* }
12+
* }
13+
*/
14+
15+
public class Solution {
16+
/**
17+
* @param intervals: an array of meeting time intervals
18+
* @return: if a person could attend all meetings
19+
*/
20+
21+
// 시간복잡도: O(n log n) - 정렬, 공간복잡도: O(1)
22+
public boolean canAttendMeetings(List<Interval> intervals) {
23+
// Write your code here
24+
25+
if (intervals == null || intervals.isEmpty()) return true;
26+
27+
Collections.sort(intervals, (i1, i2) -> i1.start - i2.start);
28+
29+
Interval previous = intervals.get(0);
30+
31+
for (int i = 1; i < intervals.size(); i++) {
32+
Interval current = intervals.get(i);
33+
if (previous.end > current.start) {
34+
return false;
35+
}
36+
previous = current;
37+
}
38+
39+
return true;
40+
}
41+
}
42+

0 commit comments

Comments
 (0)