From a9afd140eb96bde338bc532b18923ad39c7de49e Mon Sep 17 00:00:00 2001 From: hyerijung Date: Tue, 5 May 2026 12:50:23 +0900 Subject: [PATCH 1/7] init --- merge-k-sorted-lists/hyeri0903.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 merge-k-sorted-lists/hyeri0903.java diff --git a/merge-k-sorted-lists/hyeri0903.java b/merge-k-sorted-lists/hyeri0903.java new file mode 100644 index 0000000000..862683cb1a --- /dev/null +++ b/merge-k-sorted-lists/hyeri0903.java @@ -0,0 +1,15 @@ +/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ +class Solution { + public ListNode mergeKLists(ListNode[] lists) { + +} From 7da059884acff2cbeb32f91517c7ffb11dfeaf33 Mon Sep 17 00:00:00 2001 From: hyerijung Date: Tue, 5 May 2026 13:03:52 +0900 Subject: [PATCH 2/7] merge-k-sorted-lists solutions --- merge-k-sorted-lists/hyeri0903.java | 39 ++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/merge-k-sorted-lists/hyeri0903.java b/merge-k-sorted-lists/hyeri0903.java index 862683cb1a..16f89091d5 100644 --- a/merge-k-sorted-lists/hyeri0903.java +++ b/merge-k-sorted-lists/hyeri0903.java @@ -11,5 +11,42 @@ */ class Solution { public ListNode mergeKLists(ListNode[] lists) { - + /** + 1.문제: ascending liknked list 를 모두 sorted list 로 머지해라. + 2.조건 + - k = list 길이, 최소 = 0, 최대 = 10^4 + - 원소값 0 이상, 500 이하 + 3.풀이 + - priority queue(min-heap): time = O(n log k), space = O(k) + - 각 list 를 min heap 에 넣고 하나씩 뽑아서 새 리스트에 연결. + - Heap 에 들어가고 나올때마다 O(log k), 총 노드 수 N = O(N logk) + - Heap 사용 -> space = k + */ + + if(lists == null || lists.length == 0) return null; + + PriorityQueue pq = new PriorityQueue<>(lists.length, (a, b) -> a.val - b.val); + + //all list의 첫 노드 넣기 + for(ListNode node: lists) { + if (node != null) { + pq.offer(node); + } + } + + //결과 리스트를 위한 더미 노드 + ListNode dummy = new ListNode(0); + ListNode curr = dummy; + + while(!pq.isEmpty()) { + ListNode node = pq.poll(); //최소값 pop + curr.next = node; //결과 리스트에 연결 + curr = curr.next; //포인터 이동 + //다음 노드를 heap에 insert + if(node.next != null) { + pq.offer(node.next); + } + } + return dummy.next; + } } From c6e1bcfbbe6581403fc23fa76eb82e1b709e2783 Mon Sep 17 00:00:00 2001 From: hyerijung Date: Wed, 6 May 2026 16:23:22 +0900 Subject: [PATCH 3/7] invert-binary-tree solution --- invert-binary-tree/hyeri0903.java | 49 +++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 invert-binary-tree/hyeri0903.java diff --git a/invert-binary-tree/hyeri0903.java b/invert-binary-tree/hyeri0903.java new file mode 100644 index 0000000000..b59d3c0cd6 --- /dev/null +++ b/invert-binary-tree/hyeri0903.java @@ -0,0 +1,49 @@ +/** + * 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 { + public TreeNode invertTree(TreeNode root) { + /** + 1.문제: inverted binary tree 출력 + 2.constraints: node 개수 min = 0, max = 100 + 3.solution: left, right node swap + time complexity: O(n), space complexity: O(h) + */ + + if(root == null) { + return null; + } + + dfs(root); + + return root; + + } + + void dfs(TreeNode root) { + if(root == null) { + return; + } + //swap + TreeNode tmp = root.left; + root.left = root.right; + root.right = tmp; + + //left recursion + dfs(root.left); + //right recursion + dfs(root.right); + } +} From 307a0e348aff35fa307b9aeee3a16cf26041aba1 Mon Sep 17 00:00:00 2001 From: hyerijung Date: Wed, 6 May 2026 16:24:19 +0900 Subject: [PATCH 4/7] invert-binary-tree solution --- invert-binary-tree/hyeri0903.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/invert-binary-tree/hyeri0903.java b/invert-binary-tree/hyeri0903.java index b59d3c0cd6..5cef1b3e7e 100644 --- a/invert-binary-tree/hyeri0903.java +++ b/invert-binary-tree/hyeri0903.java @@ -19,7 +19,10 @@ public TreeNode invertTree(TreeNode root) { 1.문제: inverted binary tree 출력 2.constraints: node 개수 min = 0, max = 100 3.solution: left, right node swap - time complexity: O(n), space complexity: O(h) + time complexity: + - BST인 경우 best case : O(log n) + - skwed 인 경우 worst case: O(n) + - space complexity: O(h) */ if(root == null) { From 11d656ca8c59f50bc32f5c6d1a0b650ad64e1a97 Mon Sep 17 00:00:00 2001 From: hyerijung Date: Wed, 6 May 2026 16:41:59 +0900 Subject: [PATCH 5/7] search in rotated sorted array solution --- search-in-rotated-sorted-array/hyeri0903.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 search-in-rotated-sorted-array/hyeri0903.java diff --git a/search-in-rotated-sorted-array/hyeri0903.java b/search-in-rotated-sorted-array/hyeri0903.java new file mode 100644 index 0000000000..430cf359b5 --- /dev/null +++ b/search-in-rotated-sorted-array/hyeri0903.java @@ -0,0 +1,44 @@ +class Solution { + public int search(int[] nums, int target) { + /** + 1.prob: index k기준으로 left rotated 된 array 에서 target index return, 존재하지 않으면 -1 return + 2.constraints + - asc 정렬된 배열, 모두 unique 한 값 + - 반드시 O(log n) 으로 풀 것 + - num.length min=1, max = 5000 + 3.solution + - bruteforce, for문 -> time: O(n) + - binary search -> time: O(log n), space: O(1) + */ + + int n = nums.length; + int left = 0, right = n - 1; + + + while(left <= right) { + int mid = (left + right) / 2; + + //target 찾으면 index return + if(nums[mid] == target) { + return mid; + } + + if(nums[left] <= nums[mid]) { + //왼쪽이 정렬된 경우 + if(nums[left] <= target && target < nums[mid]) { + right = mid - 1; + } else { + left = mid + 1; + } + } else { + //오른쪽이 정렬된 경우 + if(nums[mid] < target && target <= nums[right]) { + left = mid + 1; + } else { + right = mid - 1; + } + } + } + return -1; + } +} From 63241cf62a9388f22ec458be2f468448cb766369 Mon Sep 17 00:00:00 2001 From: hyerijung Date: Fri, 8 May 2026 20:04:54 +0900 Subject: [PATCH 6/7] jump game solution --- jump-game/hyeri0903.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 jump-game/hyeri0903.java diff --git a/jump-game/hyeri0903.java b/jump-game/hyeri0903.java new file mode 100644 index 0000000000..628c2fa006 --- /dev/null +++ b/jump-game/hyeri0903.java @@ -0,0 +1,26 @@ +class Solution { + public boolean canJump(int[] nums) { + /** + 1.문제: last index 에 도달 가능하면 true, 아니면 false return + 2.constraints + - first index 에서 시작 + - nums.length min = 1, max = 10000 + - value min = 0, max = 100000 + 3.solution + - brute force: 0 index 부터 1, 2, 3번째 등등 시도, time: O(n^2) + - 가장 먼 index 을 업데이트하면서 체크 : time O(n) + */ + int n = nums.length; + int farthest = 0; + + for(int i = 0; i < n; i++) { + //현재까지 도달 가능한지 체크 + if(i > farthest) { + return false; + } + //도달가능한 가장 먼 인덱스 update + farthest = Math.max(farthest, i + nums[i]); + } + return true; + } +} From 9e561e28ad6e75fee511fd1ebc61a14e8f89cb87 Mon Sep 17 00:00:00 2001 From: hyerijung Date: Fri, 8 May 2026 20:40:29 +0900 Subject: [PATCH 7/7] course schedule solution --- course-schedule/hyeri0903.java | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 course-schedule/hyeri0903.java diff --git a/course-schedule/hyeri0903.java b/course-schedule/hyeri0903.java new file mode 100644 index 0000000000..1b179b45ca --- /dev/null +++ b/course-schedule/hyeri0903.java @@ -0,0 +1,56 @@ +class Solution { + public boolean canFinish(int numCourses, int[][] prerequisites) { + /** + 1.문제: [a, b] = b를 수강해야 a 수강 가능, 모두 수강가능하면 true, 아니면 flase return + 2.constraints + - numCourses min = 1, max = 2000 + - prerequisites length min = 0, max = 5000 + 3.solution + - dfs, graph에 cycle 이 존재하는지 check. cycle 이 존재하면 수강 다 못하므로 false return + */ + List> graph = new ArrayList<>(); + for(int i = 0; i < numCourses; i++) { + graph.add(new ArrayList<>()); + } + + //graph 생성 + for(int i = 0; i < prerequisites.length; i++) { + int a = prerequisites[i][0]; + int b = prerequisites[i][1]; + + graph.get(b).add(a); + } + + //dfs cycle check + //state: 0 = 방문 전, 1 = 방문 중, 2 = 방문 완료 + int[] state = new int[numCourses]; + //node 개수(numCourses)만큼 순회 + for(int i = 0; i < numCourses; i++) { + //cycle 존재하면 false return + if(dfs(i, graph, state)) { + return false; + } + } + return true; + } + + + boolean dfs(int i, List> graph, int[] state) { + //순회 cycle 발견하면 true + if(state[i] == 1) { + return true; + } + if(state[i] == 2) { + return false; + } + state[i] = 1; + + for(int next: graph.get(i)) { + if(dfs(next, graph, state)) { + return true; + } + } + state[i] = 2; + return false; + } +}