From bdf91d13be7a9713fd1c4ad30e25a8e5f91aa041 Mon Sep 17 00:00:00 2001 From: donghyeon95 Date: Mon, 16 Dec 2024 22:44:04 +0900 Subject: [PATCH 1/4] feat: Valid Anagram #218 --- valid-anagram/donghyeon95.java | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 valid-anagram/donghyeon95.java diff --git a/valid-anagram/donghyeon95.java b/valid-anagram/donghyeon95.java new file mode 100644 index 000000000..ac5b67490 --- /dev/null +++ b/valid-anagram/donghyeon95.java @@ -0,0 +1,27 @@ +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +class Solution { + public boolean isAnagram(String s, String t) { + boolean result = false; + + char[] chars = s.toCharArray(); + Map counter = new HashMap<>(); + for (char c: chars) { + counter.put(c, counter.getOrDefault(c, 0)+1); + } + + char[] tChars = t.toCharArray(); + for (char c: tChars) { + if (!counter.containsKey(c)) return false; + counter.put(c, counter.get(c)-1); + + if (counter.get(c) == 0) + counter.remove(c); + } + + return counter.isEmpty(); + } +} + From 402d5c0191e179fbeaf97fc1e940af9dd5f2d1e4 Mon Sep 17 00:00:00 2001 From: donghyeon95 Date: Thu, 19 Dec 2024 00:52:55 +0900 Subject: [PATCH 2/4] feat: Climbing Stairs #230 --- climbing-stairs/donghyeon95.java | 64 ++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 climbing-stairs/donghyeon95.java diff --git a/climbing-stairs/donghyeon95.java b/climbing-stairs/donghyeon95.java new file mode 100644 index 000000000..ce74ba608 --- /dev/null +++ b/climbing-stairs/donghyeon95.java @@ -0,0 +1,64 @@ + +/* +* 처음 풀이 +* n개 중 2를 선택하는 조합 문제로 해결 +* 21부터 overflow 발생 => 너무 큰 숫자 +* 이대로 푸려면 1과 2의 갯수가 정확하게 같아지는 경우 * 2를 하면 f(1갯수, 2갯수) 할 때, f(x, y) = f(y,x)는 같다는 점을 착안하면 42까지는 풀 수 있을 듯 하다. +* 하지만 45라서 안되는 거 같다. +* */ + +// public int climbStairs(int n) { +// // N개의 1중에서 묶이는 경우의 수가 몇개인지 +// // 5 => 1 1 1 1 1 +// // 2의 갯수가 0개 2/n 까지 있는 경우의 수를 구하면 될 듯 +// long result = 0; +// int max2Cnt = n/2; +// for (int i=0; i Date: Thu, 19 Dec 2024 00:53:14 +0900 Subject: [PATCH 3/4] feat: Valid Anagram #218 add comment --- valid-anagram/donghyeon95.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/valid-anagram/donghyeon95.java b/valid-anagram/donghyeon95.java index ac5b67490..9a231e60a 100644 --- a/valid-anagram/donghyeon95.java +++ b/valid-anagram/donghyeon95.java @@ -2,6 +2,11 @@ import java.util.HashSet; import java.util.Map; +/* + map에 넣고 빼는 시간이 O(n)이라고는 하나, 시간이 걸린다. + 반복문으로 처리할 수 있는 방법이 없을까? +*/ + class Solution { public boolean isAnagram(String s, String t) { boolean result = false; From f71e1b3f6ccc970c083813869d4186be018e2581 Mon Sep 17 00:00:00 2001 From: donghyeon95 Date: Sun, 22 Dec 2024 00:24:26 +0900 Subject: [PATCH 4/4] feat: Construct Binary Tree From Preorder And Inorder Traversal #253 --- .../donghyeon95.java | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 construct-binary-tree-from-preorder-and-inorder-traversal/donghyeon95.java diff --git a/construct-binary-tree-from-preorder-and-inorder-traversal/donghyeon95.java b/construct-binary-tree-from-preorder-and-inorder-traversal/donghyeon95.java new file mode 100644 index 000000000..d494119d6 --- /dev/null +++ b/construct-binary-tree-from-preorder-and-inorder-traversal/donghyeon95.java @@ -0,0 +1,116 @@ +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +/** + * 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 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; + } + + public void setVal(int val) { + this.val = val; + } + + public void setLeft(TreeNode left) { + this.left = left; + } + + public void setRight(TreeNode right) { + this.right = right; + } + + public int getVal() { + return val; + } + + public TreeNode getLeft() { + return left; + } + + public TreeNode getRight() { + return right; + } +} + +class Solution { + int[] preList; + List inList; + HashMap treeNodes = new HashMap<>(); + + public TreeNode buildTree(int[] preorder, int[] inorder) { + preList = preorder; + inList = Arrays.asList(Arrays.stream(inorder).boxed().toArray(Integer[]::new)); + List preL = Arrays.asList(Arrays.stream(preorder).boxed().toArray(Integer[]::new)); + + int preIndex = 0; + int rootVal = preorder[0]; + TreeNode root = new TreeNode(rootVal); + treeNodes.put(rootVal, root); + + while (preIndex < preList.length - 1) { + System.out.println(preIndex); + int inIndex = inList.indexOf(preList[preIndex]); + int inNextIndex = inList.indexOf(preList[preIndex + 1]); + + TreeNode node = new TreeNode(preList[preIndex + 1]); + treeNodes.put(preList[preIndex + 1], node); + + if (inIndex > inNextIndex) { + // 현재 node의 왼쪽 자식으로 + TreeNode nowNode = treeNodes.get(preList[preIndex]); + nowNode.setLeft(node); + } else { + // inorder의 앞 중에서 가장 처음 inList에서 앞인게 + int value = 0; + int ii = inNextIndex; + while (ii >= 0) { + value = inorder[ii - 1]; + int i = preL.indexOf(value); + if (i < preIndex + 1) { + treeNodes.get(preList[i]).setRight(node); + break; + } + ii--; + } + + } + + preIndex++; + } + + return treeNodes.get(rootVal); + } + +} + +