From 5a122cb0832658a8d5003eeda85937e6e261e9d4 Mon Sep 17 00:00:00 2001 From: JeonJe <43032391+JeonJe@users.noreply.github.com> Date: Mon, 20 Jul 2026 21:00:22 +0900 Subject: [PATCH 1/5] best time to buy and sell stock solution --- best-time-to-buy-and-sell-stock/JeonJe.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 best-time-to-buy-and-sell-stock/JeonJe.java diff --git a/best-time-to-buy-and-sell-stock/JeonJe.java b/best-time-to-buy-and-sell-stock/JeonJe.java new file mode 100644 index 0000000000..0a0293b0ae --- /dev/null +++ b/best-time-to-buy-and-sell-stock/JeonJe.java @@ -0,0 +1,18 @@ +import java.util.*; + +// TC: O(n) +// SC: O(1) +class Solution { + public int maxProfit(int[] prices) { + int n = prices.length; + int maxProfit = 0; + int minPrice = prices[0]; + + for (int sellDay = 1; sellDay < n; sellDay++) { + minPrice = Math.min(minPrice, prices[sellDay]); + maxProfit = Math.max(maxProfit, prices[sellDay] - minPrice); + } + + return maxProfit; + } +} From 916d0827a90fd7193d7e2472e6adfd2214be6db2 Mon Sep 17 00:00:00 2001 From: JeonJe <43032391+JeonJe@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:24:37 +0900 Subject: [PATCH 2/5] group anagrams solution --- group-anagrams/JeonJe.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 group-anagrams/JeonJe.java diff --git a/group-anagrams/JeonJe.java b/group-anagrams/JeonJe.java new file mode 100644 index 0000000000..8950fb553b --- /dev/null +++ b/group-anagrams/JeonJe.java @@ -0,0 +1,24 @@ +import java.util.*; + +// TC: O(n * k log k) +// SC: O(n * k) +class Solution { + public List> groupAnagrams(String[] strs) { + List> answer = new ArrayList<>(); + Map> map = new HashMap<>(); + + for (String str : strs) { + char[] charArray = str.toCharArray(); + Arrays.sort(charArray); + String sortedStr = String.valueOf(charArray); + + map.computeIfAbsent(sortedStr, k -> new ArrayList<>()).add(str); + } + + for (String s : map.keySet()) { + answer.add(map.get(s)); + } + + return answer; + } +} From 8f76d72d86632d28aba021044107826d8bc32ffd Mon Sep 17 00:00:00 2001 From: JeonJe <43032391+JeonJe@users.noreply.github.com> Date: Thu, 23 Jul 2026 08:38:16 +0900 Subject: [PATCH 3/5] encode and decode strings solution --- encode-and-decode-strings/JeonJe.java | 34 +++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 encode-and-decode-strings/JeonJe.java diff --git a/encode-and-decode-strings/JeonJe.java b/encode-and-decode-strings/JeonJe.java new file mode 100644 index 0000000000..4189006ffb --- /dev/null +++ b/encode-and-decode-strings/JeonJe.java @@ -0,0 +1,34 @@ +import java.util.*; + +// TC: O(n) +// SC: O(n) +class Solution { + + private static final String DELIMITER = ","; + + // ["mydata"] -> "6,mydata" + public String encode(List strs) { + StringBuilder sb = new StringBuilder(); + for (String s : strs) { + sb.append(s.length()).append(DELIMITER).append(s); + } + return sb.toString(); + } + + // "6,mydata" -> ["mydata"] + public List decode(String str) { + List answer = new ArrayList<>(); + + int cursor = 0; + while (cursor < str.length()) { + int indexOfDelimiter = str.indexOf(DELIMITER, cursor); + int dataStart = indexOfDelimiter + 1; + int dataLength = Integer.parseInt(str.substring(cursor, indexOfDelimiter)); + + answer.add(str.substring(dataStart, dataStart + dataLength)); + cursor = dataStart + dataLength; + } + + return answer; + } +} From fee5c4e93613a90e46813d6fb7f885017729ca18 Mon Sep 17 00:00:00 2001 From: JeonJe <43032391+JeonJe@users.noreply.github.com> Date: Thu, 23 Jul 2026 09:02:58 +0900 Subject: [PATCH 4/5] implement trie prefix tree solution --- implement-trie-prefix-tree/JeonJe.java | 47 ++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 implement-trie-prefix-tree/JeonJe.java diff --git a/implement-trie-prefix-tree/JeonJe.java b/implement-trie-prefix-tree/JeonJe.java new file mode 100644 index 0000000000..8b8ca3cbad --- /dev/null +++ b/implement-trie-prefix-tree/JeonJe.java @@ -0,0 +1,47 @@ +// TC: O(L) +// SC: O(N * L) +class TrieNode { + + public boolean isEnd; + public TrieNode[] children = new TrieNode[26]; +} + +class Trie { + + private final TrieNode root; + + public Trie() { + root = new TrieNode(); + } + + public void insert(String word) { + TrieNode node = root; + for (char c : word.toCharArray()) { + if (node.children[c - 'a'] == null) { + node.children[c - 'a'] = new TrieNode(); + } + node = node.children[c - 'a']; + } + node.isEnd = true; + } + + public boolean search(String word) { + TrieNode node = traverse(word); + return node != null && node.isEnd; + } + + public boolean startsWith(String prefix) { + return traverse(prefix) != null; + } + + private TrieNode traverse(String sequence) { + TrieNode node = root; + for (char c : sequence.toCharArray()) { + if (node.children[c - 'a'] == null) { + return null; + } + node = node.children[c - 'a']; + } + return node; + } +} From 5168c328c3c96cbcac03e1c904ba30e25b8bc94d Mon Sep 17 00:00:00 2001 From: JeonJe <43032391+JeonJe@users.noreply.github.com> Date: Sat, 25 Jul 2026 13:19:27 +0900 Subject: [PATCH 5/5] word break solution --- word-break/JeonJe.java | 51 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 word-break/JeonJe.java diff --git a/word-break/JeonJe.java b/word-break/JeonJe.java new file mode 100644 index 0000000000..c45810b39c --- /dev/null +++ b/word-break/JeonJe.java @@ -0,0 +1,51 @@ +import java.util.*; + +// n = s.length(), m = wordDict.size(), L = 사전 단어의 최대 길이 +// TC: O(n * m * L) +// SC: O(n) +class Solution { + public boolean wordBreak(String s, List wordDict) { + int n = s.length(); + + // dp[i] = 인덱스 i부터 시작하는 뒷부분을 사전 단어로 빈틈없이 쪼갤 수 있는가 + boolean[] dp = new boolean[n + 1]; + dp[n] = true; + + // dp[i]는 자기보다 오른쪽의 dp[i + word.length()]를 참조하므로 뒤에서 앞으로 채운다 + for (int i = n - 1; i >= 0; i--) { + for (String word : wordDict) { + // startsWith(word, i)는 substring 없이 i번째부터 비교한다 + if (s.startsWith(word, i) && dp[i + word.length()]) { + dp[i] = true; + break; + } + } + } + + return dp[0]; + } +} + +// 첫 번째 풀이 — top-down 재귀 + 메모이제이션 (TC: O(n^2 * m), SC: O(n^2)) +// 남은 뒷부분을 문자열 그대로 메모 key로 써서 substring으로 새 문자열을 만들고 그 문자열을 n개까지 저장한다. +// +// public boolean wordBreak(String s, List wordDict) { +// return dfs(s, wordDict, new HashMap<>()); +// } +// +// private boolean dfs(String s, List wordDict, Map memo) { +// if (s.isEmpty()) return true; +// if (memo.containsKey(s)) return memo.get(s); +// +// for (String word : wordDict) { +// if (s.startsWith(word)) { +// if (dfs(s.substring(word.length()), wordDict, memo)) { +// memo.put(s, true); +// return true; +// } +// } +// } +// +// memo.put(s, false); +// return false; +// }