diff --git a/container-with-most-water/jaejeong1.java b/container-with-most-water/jaejeong1.java new file mode 100644 index 000000000..ed045c7d9 --- /dev/null +++ b/container-with-most-water/jaejeong1.java @@ -0,0 +1,31 @@ +class SolutionMaxArea { + public int maxArea(int[] height) { + // A와 B 간 면적 = (A와 B의 X축 차이) * (A와 B Y축 중 더 작은 Y축 길이) + // 1번째 풀이 방법: 선택할 수 있는 모든 경우에 대해 위 값을 구한다, 시간복잡도: O(N^2) / 공간복잡도: O(1) + // (최종) 2번째 풀이 방법: 양쪽 끝에서 투포인터로 좁혀오면서 면적을 구한다, 시간복잡도: O(N) / 공간복잡도: O(1) + // 전체 너비를 고려하면서 움직여야한다. + // 매번 면적을 계산하고, 더 크면 저장한다. + // lt와 rt 중 더 낮은쪽을 좁힌다 + + var lt = 0; + var rt = height.length-1; + var maxArea = 0; + + while(lt < rt) { + var x = rt - lt; + var y = Math.min(height[lt], height[rt]); + var currentArea = x * y; + if (maxArea < currentArea) { + maxArea = currentArea; + } + + if (height[lt] < height[rt]) { + lt++; + } else { + rt--; + } + } + + return maxArea; + } +} diff --git a/design-add-and-search-words-data-structure/jaejeong1.java b/design-add-and-search-words-data-structure/jaejeong1.java new file mode 100644 index 000000000..3369f8887 --- /dev/null +++ b/design-add-and-search-words-data-structure/jaejeong1.java @@ -0,0 +1,63 @@ +import java.util.HashMap; +import java.util.Map; + +class WordDictionary { + // 시간복잡도: O(N), N(word의 길이) + // 공간복잡도: O(N) + Map child; + boolean isEnd; + + public WordDictionary() { + child = new HashMap<>(); + isEnd = false; + } + + public void addWord(String word) { + var node = this; + for (int i = 0; i < word.length(); i++) { + char c = word.charAt(i); + + node.child.putIfAbsent(c, new WordDictionary()); + node = node.child.get(c); + + if (i == word.length() - 1) { + node.isEnd = true; + return; + } + } + } + + public boolean search(String word) { + return searchHelper(word, 0, this); + } + + private boolean searchHelper(String word, int index, WordDictionary node) { + if (index == word.length()) { + return node.isEnd; + } + + char c = word.charAt(index); + // . 이 나오면 해당 노드의 자식 노드들에 대해 모두 재귀를 돌린다 + if (c == '.') { + for (WordDictionary childNode : node.child.values()) { + if (searchHelper(word, index + 1, childNode)) { + return true; + } + } + return false; + } else { + var childNode = node.child.get(c); + if (childNode == null) { + return false; + } + return searchHelper(word, index + 1, childNode); + } + } +} + +/** + * Your WordDictionary object will be instantiated and called as such: + * WordDictionary obj = new WordDictionary(); + * obj.addWord(word); + * boolean param_2 = obj.search(word); + */ diff --git a/valid-parentheses/jaejeong1.java b/valid-parentheses/jaejeong1.java new file mode 100644 index 000000000..62737c356 --- /dev/null +++ b/valid-parentheses/jaejeong1.java @@ -0,0 +1,45 @@ +import java.util.HashMap; +import java.util.Stack; +import java.util.Map; + +class SolutionValidParentheses { + + public boolean isValid(String s) { + // last in first out 방식으로 처리해야하므로 스택 사용 + // 여는 문자면 put + // 닫는 문자면 pop + // 이 때 pop 대상이 올바른 짝인지 확인한다. 아니면 false 반환 + // 짝 확인 시 O(1)로 처리하기 위해 Map을 사용, 여는 문자와 닫는 문자를 key:value로 매핑 + // 끝까지 돌았고, 스택이 비어있으면 return true, 아니면 false 반환 + // 시간복잡도: O(N), 공간복잡도: O(N) + + Stack stack = new Stack<>(); + + Map matchedMap = new HashMap<>(); + matchedMap.put('(', ')'); + matchedMap.put('{', '}'); + matchedMap.put('[', ']'); + + for (int i=0; i