Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[jaejeong1] Week 6 #466

Merged
merged 3 commits into from
Sep 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions container-with-most-water/jaejeong1.java
Original file line number Diff line number Diff line change
@@ -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--;
}
}
jaejeong1 marked this conversation as resolved.
Show resolved Hide resolved

return maxArea;
}
}
63 changes: 63 additions & 0 deletions design-add-and-search-words-data-structure/jaejeong1.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import java.util.HashMap;
import java.util.Map;

class WordDictionary {
// 시간복잡도: O(N), N(word의 길이)
// 공간복잡도: O(N)
Map<Character, WordDictionary> 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);
}
jaejeong1 marked this conversation as resolved.
Show resolved Hide resolved

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);
*/
45 changes: 45 additions & 0 deletions valid-parentheses/jaejeong1.java
Original file line number Diff line number Diff line change
@@ -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<Character> stack = new Stack<>();

Map<Character, Character> matchedMap = new HashMap<>();
matchedMap.put('(', ')');
matchedMap.put('{', '}');
matchedMap.put('[', ']');
jaejeong1 marked this conversation as resolved.
Show resolved Hide resolved

for (int i=0; i<s.length(); i++) {
var currentChar = s.charAt(i);

// 여는 문자
if (matchedMap.containsKey(currentChar)) {
stack.push(currentChar);
} else { // 닫는 문자
if (stack.isEmpty()) { // 여는 문자가 없을 경우 false
return false;
}

var prevChar = stack.peek();
if (matchedMap.get(prevChar).equals(currentChar)) {
stack.pop();
} else { // 닫는 문자와 여는 문자 짝이 안맞을 경우 false
return false;
}
}
}

return stack.isEmpty(); // 스택이 비어있으면 모든 짝 매칭이 완료된 것으로 true 반환
}
}