diff --git a/non-overlapping-intervals/dahyeong-yun.java b/non-overlapping-intervals/dahyeong-yun.java new file mode 100644 index 0000000000..a82915da15 --- /dev/null +++ b/non-overlapping-intervals/dahyeong-yun.java @@ -0,0 +1,23 @@ +/** + * TC : O(n log n) + * - intervals 배열의 길이 n 을 최초 정렬 하므로 O(n log n) + * - 이후 for loop 는 O(n) + * SC : O(1) + * - 별도 유의미한 공간 할당은 없음 + */ +class Solution { + public int eraseOverlapIntervals(int[][] intervals) { + Arrays.sort(intervals, (a, b) -> Integer.compare(a[1], b[1])); + + int count = 1; + int beforeEnd = intervals[0][1]; + + for (int i = 1; i < intervals.length; i++) { + if (intervals[i][0] >= beforeEnd) { + count++; + beforeEnd = intervals[i][1]; + } + } + return intervals.length - count; + } +} diff --git a/remove-nth-node-from-end-of-list/dahyeong-yun.java b/remove-nth-node-from-end-of-list/dahyeong-yun.java new file mode 100644 index 0000000000..3f06731796 --- /dev/null +++ b/remove-nth-node-from-end-of-list/dahyeong-yun.java @@ -0,0 +1,32 @@ +/** + * TC: O(n) + * - ListNode의 길이 n 만큰 순회하므로 O(n) + * SC: O(n) + * - ListNode의 길이 n 만큼 ArrayList 할당하므로 O(n) + */ +class Solution { + public ListNode removeNthFromEnd(ListNode head, int n) { + List list = new ArrayList<>(); + ListNode cursor = head.next; + list.add(head); + + while (cursor != null) { + list.add(cursor); + cursor = cursor.next; + } + + int sz = list.size(); + int deleteTarget = list.size() - n; + if (deleteTarget < 0) + return null; + + if (deleteTarget - 1 >= 0 && deleteTarget <= sz - 2) { + list.get(deleteTarget - 1).next = list.get(deleteTarget + 1); + } else if(deleteTarget == 0) { + head = head.next; + } else { + list.get(deleteTarget - 1).next = null; + } + return head; + } +} diff --git a/same-tree/dahyeong-yun.java b/same-tree/dahyeong-yun.java new file mode 100644 index 0000000000..5f3774fcf6 --- /dev/null +++ b/same-tree/dahyeong-yun.java @@ -0,0 +1,20 @@ +/** + * TC : O(n) + * - TreeNode의 노드 수 n 만큼 순회하므로 O(n) + * SC : O(n) + * - TreeNode의 노드 높이 h 만큼 콜스택이 쌓이고, 편향 트리의 경우 O(n) 까지 공간이 필요 + */ +class Solution { + public boolean isSameTree(TreeNode p, TreeNode q) { + // p와 q 둘다 null 인가? + if(p == null && q == null) { + return true; + } else if(p == null || q == null) { // 하나만 null 인가 + return false; + } else if(p.val != q.val) { + return false; + } else { + return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); + } + } +}