From 8fead5831c963c489d7ca088f6ffca7c6cce5bb3 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Mon, 23 Jun 2025 23:20:12 +0900 Subject: [PATCH 01/14] start new pull request --- meeting-rooms/Tessa1217.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 meeting-rooms/Tessa1217.java diff --git a/meeting-rooms/Tessa1217.java b/meeting-rooms/Tessa1217.java new file mode 100644 index 000000000..046213d6a --- /dev/null +++ b/meeting-rooms/Tessa1217.java @@ -0,0 +1,2 @@ +public class Solution { +} From 1b735529f5d155da8ba87005ae96013e45cec60b Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Mon, 23 Jun 2025 23:40:47 +0900 Subject: [PATCH 02/14] add kth smallest element in a bst solution --- kth-smallest-element-in-a-bst/Tessa1217.java | 51 ++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 kth-smallest-element-in-a-bst/Tessa1217.java diff --git a/kth-smallest-element-in-a-bst/Tessa1217.java b/kth-smallest-element-in-a-bst/Tessa1217.java new file mode 100644 index 000000000..452fd995a --- /dev/null +++ b/kth-smallest-element-in-a-bst/Tessa1217.java @@ -0,0 +1,51 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +class Solution { + + private int count = 0; + + private int kthSmallValue = 0; + + // 시간복잡도: O(k) (불균형 상태의 이진 트리일 경우 O(n)) + public int kthSmallest(TreeNode root, int k) { + orderSearch(root, k); + return kthSmallValue; + } + + // In Order Search + private void orderSearch(TreeNode node, int k) { + + if (node == null) { + return; + } + + // HINT => utilize the property of a BST => 좌측 리프 노드부터 탐색 + orderSearch(node.left, k); + + count++; + + if (count == k) { + kthSmallValue = node.val; + return; + } + + // search right side + orderSearch(node.right, k); + + } + +} + From 11c1853754bfd08cf6c482a7a7ce5b78bddbba5d Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Thu, 26 Jun 2025 20:47:09 +0900 Subject: [PATCH 03/14] add lowest common ancestor of a BST solution --- .../Tessa1217.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 lowest-common-ancestor-of-a-binary-search-tree/Tessa1217.java diff --git a/lowest-common-ancestor-of-a-binary-search-tree/Tessa1217.java b/lowest-common-ancestor-of-a-binary-search-tree/Tessa1217.java new file mode 100644 index 000000000..cc5d2dfb2 --- /dev/null +++ b/lowest-common-ancestor-of-a-binary-search-tree/Tessa1217.java @@ -0,0 +1,33 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +class Solution { + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + + if (root == null || root == p || root == q) { + return root; + } + + // 재귀로 좌측과 우측 탐색 + TreeNode left = lowestCommonAncestor(root.left, p, q); + + TreeNode right = lowestCommonAncestor(root.right, p, q); + + // 좌우 둘 다 null이 아니라면: 현재 root를 조상으로 하는 서브 트리에서 p와 q를 발견했음을 의미하므로 root가 공통 조상 + if (left != null && right != null) { + return root; + } else if (left != null) { + return left; + } else { + return right; + } + + } +} + From c59747e4c1d7600224ab9559357300d6bc556525 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Thu, 26 Jun 2025 20:47:23 +0900 Subject: [PATCH 04/14] find median from data stream solution --- find-median-from-data-stream/Tessa1217.java | 46 +++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 find-median-from-data-stream/Tessa1217.java diff --git a/find-median-from-data-stream/Tessa1217.java b/find-median-from-data-stream/Tessa1217.java new file mode 100644 index 000000000..ff717faf6 --- /dev/null +++ b/find-median-from-data-stream/Tessa1217.java @@ -0,0 +1,46 @@ +import java.util.PriorityQueue; + +class MedianFinder { + + // 작은 수 범위 저장하는 힙 + private PriorityQueue smallHeap; + + // 큰 수 범위 저장하는 힙 + private PriorityQueue largeHeap; + + public MedianFinder() { + smallHeap = new PriorityQueue<>((a, b) -> b - a); + largeHeap = new PriorityQueue<> ((a, b) -> a - b); + } + + public void addNum(int num) { + // 작은 수 범위에 삽입 + smallHeap.offer(num); + // 작은 수 범위에서 최댓값을 뽑아 큰 수 범위로 이동 + largeHeap.offer(smallHeap.poll()); + + // 만약 작은 수 범위의 개수가 큰 수 범위보다 작다면 + if (smallHeap.size() < largeHeap.size()) { + // 큰 수 범위에서 최솟값을 뽑아 작은 수 범위로 이동 + smallHeap.offer(largeHeap.poll()); + } + } + + public double findMedian() { + // 짝수 개일 경우 + if (smallHeap.size() == largeHeap.size()) { + // 작은 수 범위 힙의 최댓값 + 큰 수 범위 힙의 최솟값의 평균 + return (smallHeap.peek() + largeHeap.peek()) / 2.0; + } + // 작은 수 범위 힙의 최댓값 + return smallHeap.peek(); + } +} + +/** + * Your MedianFinder object will be instantiated and called as such: + * MedianFinder obj = new MedianFinder(); + * obj.addNum(num); + * double param_2 = obj.findMedian(); + */ + From 0948a7c76c2e7a4f1ffb400d171b5a7d056ff1eb Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Thu, 26 Jun 2025 20:58:22 +0900 Subject: [PATCH 05/14] add meeting rooms solution --- meeting-rooms/Tessa1217.java | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/meeting-rooms/Tessa1217.java b/meeting-rooms/Tessa1217.java index 046213d6a..3ad8cf994 100644 --- a/meeting-rooms/Tessa1217.java +++ b/meeting-rooms/Tessa1217.java @@ -1,2 +1,42 @@ +import java.util.Collections; +import java.util.List; + +/** + * Definition of Interval: + * public class Interval { + * int start, end; + * Interval(int start, int end) { + * this.start = start; + * this.end = end; + * } + * } + */ + public class Solution { + /** + * @param intervals: an array of meeting time intervals + * @return: if a person could attend all meetings + */ + + // 시간복잡도: O(n log n) - 정렬, 공간복잡도: O(1) + public boolean canAttendMeetings(List intervals) { + // Write your code here + + if (intervals == null || intervals.isEmpty()) return true; + + Collections.sort(intervals, (i1, i2) -> i1.start - i2.start); + + Interval previous = intervals.get(0); + + for (int i = 1; i < intervals.size(); i++) { + Interval current = intervals.get(i); + if (previous.end > current.start) { + return false; + } + previous = current; + } + + return true; + } } + From 3551c6b4e53e41e38674df762e3c841e55484059 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Fri, 27 Jun 2025 00:49:59 +0900 Subject: [PATCH 06/14] add insert interval solution --- insert-interval/Tessa1217.java | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 insert-interval/Tessa1217.java diff --git a/insert-interval/Tessa1217.java b/insert-interval/Tessa1217.java new file mode 100644 index 000000000..8e14916ab --- /dev/null +++ b/insert-interval/Tessa1217.java @@ -0,0 +1,39 @@ +import java.util.ArrayList; +import java.util.List; + +class Solution { + + // 시간, 공간복잡도: O(n) + public int[][] insert(int[][] intervals, int[] newInterval) { + + // 병합된 interval 담는 list + List modifyIntervals = new ArrayList<>(); + + int idx = 0; + + // 병합 이전 구간 + while (idx < intervals.length && intervals[idx][1] < newInterval[0]) { + modifyIntervals.add(intervals[idx]); + idx++; + } + + // 병합이 필요한 구간 (newInterval과 겹치는 구간) + while (idx < intervals.length && intervals[idx][0] <= newInterval[1]) { + newInterval[0] = Math.min(intervals[idx][0], newInterval[0]); + newInterval[1] = Math.max(intervals[idx][1], newInterval[1]); + idx++; + } + + // 최종 병합된 새로운 interval add + modifyIntervals.add(newInterval); + + // 병합 이후 구간 + while (idx < intervals.length) { + modifyIntervals.add(intervals[idx]); + idx++; + } + + return modifyIntervals.toArray(new int[modifyIntervals.size()][2]); + } +} + From 6bd9e352089d78484c62ab4507d5562e2aab07df Mon Sep 17 00:00:00 2001 From: Tessa1217 <96612755+Tessa1217@users.noreply.github.com> Date: Wed, 2 Jul 2025 09:28:07 +0900 Subject: [PATCH 07/14] Create Tessa1217.java --- counting-bits/Tessa1217.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 counting-bits/Tessa1217.java diff --git a/counting-bits/Tessa1217.java b/counting-bits/Tessa1217.java new file mode 100644 index 000000000..230d82eb7 --- /dev/null +++ b/counting-bits/Tessa1217.java @@ -0,0 +1,4 @@ +class Solution { + +} + From fa8a8392a74dbe8bac580ad2960c4bf603db20d2 Mon Sep 17 00:00:00 2001 From: Tessa1217 <96612755+Tessa1217@users.noreply.github.com> Date: Wed, 2 Jul 2025 09:34:07 +0900 Subject: [PATCH 08/14] Delete counting-bits/Tessa1217.java --- counting-bits/Tessa1217.java | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 counting-bits/Tessa1217.java diff --git a/counting-bits/Tessa1217.java b/counting-bits/Tessa1217.java deleted file mode 100644 index 230d82eb7..000000000 --- a/counting-bits/Tessa1217.java +++ /dev/null @@ -1,4 +0,0 @@ -class Solution { - -} - From e003d090db6ab77934d823e082fd4ade7556dcb5 Mon Sep 17 00:00:00 2001 From: Tessa1217 <96612755+Tessa1217@users.noreply.github.com> Date: Wed, 2 Jul 2025 09:34:32 +0900 Subject: [PATCH 09/14] Create Tessa1217.java --- counting-bits/Tessa1217.java | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 counting-bits/Tessa1217.java diff --git a/counting-bits/Tessa1217.java b/counting-bits/Tessa1217.java new file mode 100644 index 000000000..bf9a80644 --- /dev/null +++ b/counting-bits/Tessa1217.java @@ -0,0 +1,3 @@ +class Solution { +} + From 02b7a35b8a0daa68a7fae4b30538eb35b272b3e8 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Wed, 2 Jul 2025 21:39:30 +0900 Subject: [PATCH 10/14] add counting bits solution --- counting-bits/Tessa1217.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/counting-bits/Tessa1217.java b/counting-bits/Tessa1217.java index bf9a80644..3b020e4d7 100644 --- a/counting-bits/Tessa1217.java +++ b/counting-bits/Tessa1217.java @@ -1,3 +1,14 @@ class Solution { + + // 시간복잡도: O(n) + public int[] countBits(int n) { + int[] bitsArray = new int[n + 1]; + for (int i = 1; i <= n; i++) { + // Shift 연산자 사용 + // i&1 => 마지막 비트가 0인지 1인지 확인 + bitsArray[i] = bitsArray[i >> 1] + (i & 1); + } + return bitsArray; + } } From 850f6285810f6dd04093988b9a9c46303b9ce0f9 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Wed, 2 Jul 2025 21:45:21 +0900 Subject: [PATCH 11/14] add binary tree level order traversal solution --- .../Tessa1217.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 binary-tree-level-order-traversal/Tessa1217.java diff --git a/binary-tree-level-order-traversal/Tessa1217.java b/binary-tree-level-order-traversal/Tessa1217.java new file mode 100644 index 000000000..406e49fdb --- /dev/null +++ b/binary-tree-level-order-traversal/Tessa1217.java @@ -0,0 +1,87 @@ +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +class Solution { + + // DFS 풀이 + public List> levelOrder(TreeNode root) { + List> result = new ArrayList<>(); + dfs(root, 0, result); + return result; + } + + private void dfs(TreeNode node, int depth, List> result) { + if (node == null) { + return; + } + + // 깊이만큼의 리스트가 없으면 새 리스트 추가하기 + if (depth == result.size()) { + result.add(new ArrayList<>()); + } + + result.get(depth).add(node.val); + + dfs(node.left, depth + 1, result); + dfs(node.right, depth + 1, result); + + + } + + // BFS로 풀이 + // O(n) +// public List> levelOrder(TreeNode root) { +// +// List> result = new ArrayList<>(); +// +// if (root == null) { +// return result; +// } +// +// Queue queue = new LinkedList<>(); +// queue.offer(root); +// +// while (!queue.isEmpty()) { +// int nodeCnt = queue.size(); +// List currentLevelNodes = new ArrayList<>(); +// +// for (int i = 0; i < nodeCnt; i++) { +// TreeNode current = queue.poll(); +// currentLevelNodes.add(current.val); +// +// if (current.left != null) { +// queue.offer(current.left); +// } +// +// if (current.right != null) { +// queue.offer(current.right); +// } +// +// } +// +// result.add(currentLevelNodes); +// +// } +// +// return result; +// +// } +} + From 176e6fab38c1ca2ed0ba223550146e5e23ebcb99 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Wed, 2 Jul 2025 22:14:12 +0900 Subject: [PATCH 12/14] add word search 2 solution --- word-search-ii/Tessa1217.java | 90 +++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 word-search-ii/Tessa1217.java diff --git a/word-search-ii/Tessa1217.java b/word-search-ii/Tessa1217.java new file mode 100644 index 000000000..6e4e51a87 --- /dev/null +++ b/word-search-ii/Tessa1217.java @@ -0,0 +1,90 @@ +import java.util.ArrayList; +import java.util.List; + +class Solution { + + private int[] dx = {0, 0, 1, -1}; + private int[] dy = {1, -1, 0, 0}; + + private int m; + private int n; + + class TrieNode { + // 단어는 영어 소문자만으로 이루어짐 + TrieNode[] nodes = new TrieNode[26]; + String word = null; + } + + private void insert(TrieNode root, String word) { + TrieNode node = root; + for (char c : word.toCharArray()) { + int idx = c - 'a'; + if (node.nodes[idx] == null) { + node.nodes[idx] = new TrieNode(); + } + node = node.nodes[idx]; + } + // 단어 + node.word = word; + } + + public List findWords(char[][] board, String[] words) { + + List existingWords = new ArrayList<>(); + + // 탐색 최적화를 위해 TrieNode 생성 + TrieNode root = new TrieNode(); + for (String word : words) { + insert(root, word); + } + + m = board.length; + n = board[0].length; + + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + dfs(board, i, j, root, existingWords); + } + } + + return existingWords; + } + + private void dfs(char[][] board, int i, int j, TrieNode node, List existingWords) { + + char c = board[i][j]; + + // 방문 처리 되었거나 TrieNode에 없는 글자라면 탐색 X => Pruning + if (c == '#' || node.nodes[c - 'a'] == null) { + return; + } + + node = node.nodes[c - 'a']; + + // node의 완성된 단어가 있다면 + if (node.word != null) { + existingWords.add(node.word); + node.word = null; + } + + // 방문 처리 + board[i][j] = '#'; + + for (int idx = 0; idx < 4; idx++) { + int ni = i + dx[idx]; + int nj = j + dy[idx]; + if (isRange(ni, nj)) { + dfs(board, ni, nj, node, existingWords); + } + } + + board[i][j] = c; + } + + // 탐색 범위 조건 + private boolean isRange(int i, int j) { + return i >= 0 && j >= 0 && i < m && j < n; + } + +} + From 991efc820fb1f8bb31d1f0cbddec4a4a751f3b7f Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Wed, 2 Jul 2025 22:26:20 +0900 Subject: [PATCH 13/14] add meeting rooms 2 solution --- meeting-rooms-ii/Tessa1217.java | 55 +++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 meeting-rooms-ii/Tessa1217.java diff --git a/meeting-rooms-ii/Tessa1217.java b/meeting-rooms-ii/Tessa1217.java new file mode 100644 index 000000000..2eda9e8df --- /dev/null +++ b/meeting-rooms-ii/Tessa1217.java @@ -0,0 +1,55 @@ +import java.util.List; +import java.util.PriorityQueue; + +/** + * Definition of Interval: + * public class Interval { + * int start, end; + * Interval(int start, int end) { + * this.start = start; + * this.end = end; + * } + * } + */ + +public class Solution { + /** + * @param intervals: an array of meeting time intervals + * @return: the minimum number of conference rooms required + */ + // 시간복잡도: O(n log n) + public int minMeetingRooms(List intervals) { + + if (intervals == null || intervals.isEmpty()) { + return 0; + } + + // 주어진 시간 인터벌 리스트를 시작 시간 기준으로 정렬 + intervals.sort((i1, i2) -> i1.start - i2.start); + + // PriorityQueue 선언: 시간 interval의 end time 기준 + PriorityQueue meetingRooms = new PriorityQueue<>((i1, i2) -> i1.end - i2.end); + + for (Interval interval : intervals) { + + // 최초 meeting room + if (meetingRooms.isEmpty()) { + meetingRooms.offer(interval); + continue; + } + + Interval meeting = meetingRooms.peek(); + // (0, 8), (8, 10) is not conflict at 8 + if (meeting.end <= interval.start) { + // 앞의 회의 종료되었으므로 회의실 재사용 + meetingRooms.poll(); + } + // 새 회의실 추가 + meetingRooms.offer(interval); + } + + return meetingRooms.size(); + + } +} + From 43c85720b0b6cb5a55914adab02fcc158755109e Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Wed, 2 Jul 2025 22:56:33 +0900 Subject: [PATCH 14/14] house robber ii solution added --- house-robber-ii/Tessa1217.java | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 house-robber-ii/Tessa1217.java diff --git a/house-robber-ii/Tessa1217.java b/house-robber-ii/Tessa1217.java new file mode 100644 index 000000000..2014b0e40 --- /dev/null +++ b/house-robber-ii/Tessa1217.java @@ -0,0 +1,45 @@ +class Solution { + + // DP + public int rob(int[] nums) { + int n = nums.length; + + if (n == 0) { + return 0; + } + + if (n == 1) { + return nums[0]; + } + + int notRobbingLast = robHouses(nums, 0, n - 2); + int notRobbingFirst = robHouses(nums, 1, n - 1); + + return Math.max(notRobbingLast, notRobbingFirst); + } + + private int robHouses(int[] nums, int start, int end) { + + int length = end - start + 1; + + if (length == 0) { + return 0; + } + + if (length == 1) { + return nums[start]; + } + + int[] dp = new int[length]; + + dp[0] = nums[start]; + dp[1] = Math.max(nums[start], nums[start + 1]); + + for (int i = 2; i < length; i++) { + dp[i] = Math.max(dp[i - 2] + nums[start + i], dp[i - 1]); + } + + return dp[length - 1]; + } +} +