diff --git a/construct-binary-tree-from-preorder-and-inorder-traversal/taekwon-dev.java b/construct-binary-tree-from-preorder-and-inorder-traversal/taekwon-dev.java new file mode 100644 index 000000000..af6a0d65d --- /dev/null +++ b/construct-binary-tree-from-preorder-and-inorder-traversal/taekwon-dev.java @@ -0,0 +1,36 @@ +/** + * https://www.algodale.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ + * + * <풀이1 기준> 시도! + * - 공간 복잡도: O(N^2) - Java 에서는 Call-by-value, 메서드 호출 시 인자 값이 복사되어 전달됨 / 배열 길이에 따라서 재귀 호출 스택이 점점 깊어짐 (각 호출마다 서브 배열 생성) + * - 시간 복잡도: inorder 배열에서 root 노드를 찾아가는 과정이 O(N), 그리고 이를 재귀 호출마다 반복하므로 O(N^2) + */ +class Solution { + public TreeNode buildTree(int[] preorder, int[] inorder) { + return buildTree(preorder, inorder, 0, 0, inorder.length - 1); + } + + private TreeNode buildTree(int[] preorder, int[] inorder, int rootIdx, int inorderStartIdx, int inorderEndIdx) { + if (inorderStartIdx > inorderEndIdx) { + return null; + } + + int rootVal = preorder[rootIdx]; + TreeNode root = new TreeNode(rootVal); + + int rootIdxOnInorder = 0; + for (int i = inorderStartIdx; i <= inorderEndIdx; i++) { + if (inorder[i] == rootVal) { + rootIdxOnInorder = i; + break; + } + } + + int leftLength = rootIdxOnInorder - inorderStartIdx; + + root.left = buildTree(preorder, inorder, rootIdx + 1, inorderStartIdx, rootIdxOnInorder - 1); + root.right = buildTree(preorder, inorder, rootIdx + 1 + leftLength, rootIdxOnInorder + 1, inorderEndIdx); + + return root; + } +} diff --git a/counting-bits/taekwon-dev.java b/counting-bits/taekwon-dev.java new file mode 100644 index 000000000..941efe18a --- /dev/null +++ b/counting-bits/taekwon-dev.java @@ -0,0 +1,19 @@ +/** + * 공간 복잡도: O(N) + * 시간 복잡도: O(N) + * - 만약 1 ~ N 까지 각 수에 대해서 이진수로 변환한 뒤 1의 개수를 카운트 했다면? - O(NlogN) + * Note: + * - a >> b: a 의 이진 표현을 오픈쪽으로 b 비트만큼 이동 + * - i >> 1: a 의 이진 표현에서 가장 오픈쪽 하나가 잘림 (i는 양수 범위를 가지므로, 왼쪽은 0으로 채워짐) + * - a & b: AND 연산 + * - i & 1: 이전 결과 값이 메모되어 있으므로, 내가 궁금한 것 가장 마지막 자리 수 값이 1인지 여부. + */ +class Solution { + public int[] countBits(int n) { + int[] result = new int[n + 1]; + for (int i = 1; i <= n; i++) { + result[i] = result[i >> 1] + (i & 1); + } + return result; + } +} diff --git a/valid-anagram/taekwon-dev.java b/valid-anagram/taekwon-dev.java new file mode 100644 index 000000000..c2b578361 --- /dev/null +++ b/valid-anagram/taekwon-dev.java @@ -0,0 +1,28 @@ +/** + * 처음 문제를 보고 들었던 생각: 정렬 시켜서 같으면 anagram? + * 근데, 정렬 시켜서 같다면, 결국 문자열을 구성하는 각 문자의 빈도수가 같다. + * + * 시간 복잡도: O(N) + * 공간 복잡도: O(1) + */ +class Solution { + public boolean isAnagram(String s, String t) { + if (s.length() != t.length()) return false; + + int[] charCount = new int[26]; + + for (int i = 0; i < s.length(); i++) { + charCount[s.charAt(i) - 'a']++; + } + + for (int i = 0; i < t.length(); i++) { + int index = t.charAt(i) - 'a'; + charCount[index]--; + if (charCount[index] < 0) { + return false; + } + } + + return true; + } +}