Skip to content

Commit

Permalink
feat : week 5
Browse files Browse the repository at this point in the history
  • Loading branch information
imsosleepy committed Jan 11, 2025
1 parent 9bfe4f6 commit c026aed
Show file tree
Hide file tree
Showing 5 changed files with 229 additions and 0 deletions.
40 changes: 40 additions & 0 deletions best-time-to-buy-and-sell-stock/imsosleepy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// νˆ¬ν¬μΈν„°λ₯Ό μ“Έ ν•„μš” μ—†μŒ. κ·Έλƒ₯ μ΅œμ†Œκ°’μ„ μ°Ύμ•„ λΉΌμ£Όλ©΄ O(N)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 얻을 수 μžˆλ‹€.
// νˆ¬ν¬μΈν„°μ™€ 큰 차이가 μ—†λŠ” μ΄μœ λŠ” νˆ¬ν¬μΈν„°λ„ O(N)이기 λ•Œλ¬Έ. μ•„μ£Ό μ•½κ°„μ˜ κ³΅κ°„λ³΅μž‘λ„ 차이만 μžˆμ„ λ“―
// κ²°κ³ΌλŠ” 큰 차이 μ—†μœΌλ‚˜ μ•Œκ³ λ¦¬μ¦˜ μžμ²΄κ°€ 더 쉽닀.
class Solution {
public int maxProfit(int[] prices) {
int minPrice = Integer.MAX_VALUE;
int maxProfit = 0;

for (int price : prices) {
if (price < minPrice) {
minPrice = price;
} else {
maxProfit = Math.max(maxProfit, price - minPrice);
}
}

return maxProfit;
}
}

// 처음 μƒκ°ν•œ νˆ¬ν¬μΈν„° 방식
class Solution {
public int maxProfit(int[] prices) {
int left = 0;
int right = 1;
int maxProfit = 0;

while (right < prices.length) {
if (prices[left] < prices[right]) {
int profit = prices[right] - prices[left];
maxProfit = Math.max(maxProfit, profit);
} else {
left = right;
}
right++;
}

return maxProfit;
}
}
61 changes: 61 additions & 0 deletions encode-and-decode-strings/imsosleepy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// μ•„μ΄λ””μ–΄λ‘œ ν‘ΈλŠ” 문제라 μ„ ν˜Έν•˜μ§€ μ•ŠλŠ” 문제...
// κ·Έλƒ₯ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것을 κ΅¬λΆ„μžλ‘œ 두고 μŠ€ν”Œλ¦Ών•˜λŠ”κ²Œ κ°€μž₯ νŽΈν•˜λ‹€. μ•„μ˜ˆ λ‚˜μ˜€μ§€ μ•Šμ„ 문자λ₯Ό κΈ°μ€€μœΌλ‘œ 두면 길이λ₯Ό μ•Œ ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έ
public class Solution {
// 인코딩 λ©”μ„œλ“œ
public String encode(List<String> strs) {
StringBuilder encodedString = new StringBuilder();

for (String str : strs) {
encodedString.append(str.length()).append("#").append(str);
}

return encodedString.toString();
}

// λ””μ½”λ”© λ©”μ„œλ“œ
public List<String> decode(String s) {
List<String> decodedList = new ArrayList<>();
int i = 0;

while (i < s.length()) {

int j = i;
while (s.charAt(j) != '#') {
j++;
}

int length = Integer.parseInt(s.substring(i, j));
decodedList.add(s.substring(j + 1, j + 1 + length));

i = j + 1 + length;
}

return decodedList;
}
}
// πŸš€λ₯Ό κΈ°μ€€μœΌλ‘œ λ¬Έμžμ—΄μ„ 뢄리
// @!#$@#$ 이런걸 μŠ€ν”Œλ¦Ώ 문자둜 λ‘λŠ” 방법도 μžˆλ‹€.μ•„μ΄μ˜¨
public class Solution {

public String encode(List<String> strs) {
StringBuilder encodedString = new StringBuilder();

for (String str : strs) {
encodedString.append(str).append("πŸš€");
}

return encodedString.toString();
}

public List<String> decode(String s) {
String[] parts = s.split("πŸš€");
List<String> decodedList = new ArrayList<>();
for (String part : parts) {
if (!part.isEmpty()) {
decodedList.add(part);
}
}

return decodedList;
}
}
16 changes: 16 additions & 0 deletions group-anagrams/imsosleepy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// λͺ¨λ“  단어λ₯Ό μ •λ ¬ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ‹œκ°„ λ³΅μž‘λ„κ°€ κ½€ λ‚˜μ˜€λŠ” 문제
// ν•˜μ§€λ§Œ λͺ¨λ“  단어λ₯Ό 정렬해도 λœλ‹€λŠ”κ±΄ κΈ€μž μˆ˜κ°€ 100자 μ œν•œμ΄ μžˆμ–΄μ„œ μœ μΆ”ν•  수 μžˆλ‹€.
// O(N) * O(MlogM) N λ°°μ—΄ 길이, M κΈ€μžμˆ˜μ˜ μ‹œκ°„λ³΅μž‘λ„κ°€ λ‚˜μ˜΄
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String,List<String>> anagrams = new HashMap<>();
for(String str: strs) {
char[] charArray = str.toCharArray();
Arrays.sort(charArray);
String sortedWord = new String(charArray);
anagrams.computeIfAbsent(sortedWord, k -> new ArrayList<>()).add(str);
}

return new ArrayList<>(anagrams.values());
}
}
92 changes: 92 additions & 0 deletions implement-trie-prefix-tree/imsosleepy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
// GPT의 풀이. 트리λ₯Ό μ΄μš©ν•΄ O(m)으둜 ν•΄κ²°ν–ˆλ‹€.
public class Trie {
private class TrieNode {
TrieNode[] children;
boolean isEndOfWord;

public TrieNode() {
children = new TrieNode[26]; // μ•ŒνŒŒλ²³ a~z (26개의 μžμ‹ λ…Έλ“œ)
isEndOfWord = false; // ν•΄λ‹Ή λ…Έλ“œκ°€ λ‹¨μ–΄μ˜ 끝인지 μ•„λ‹Œμ§€ λ‚˜νƒ€λƒ„
}
}

private TrieNode root;

public Trie() {
root = new TrieNode(); // 루트 λ…Έλ“œ μ΄ˆκΈ°ν™”
}

public void insert(String word) {
TrieNode node = root;
for (char c : word.toCharArray()) {
int index = c - 'a'; // μ•ŒνŒŒλ²³μ„ 0-25의 숫자둜 λ³€ν™˜
if (node.children[index] == null) {
node.children[index] = new TrieNode(); // ν•΄λ‹Ή λ¬Έμžκ°€ μ—†μœΌλ©΄ μƒˆ λ…Έλ“œλ₯Ό 생성
}
node = node.children[index]; // μžμ‹ λ…Έλ“œλ‘œ 이동
}
node.isEndOfWord = true; // λ‹¨μ–΄μ˜ 끝을 ν‘œμ‹œ
}

public boolean search(String word) {
TrieNode node = root;
for (char c : word.toCharArray()) {
int index = c - 'a';
if (node.children[index] == null) {
return false; // ν•΄λ‹Ή λ¬Έμžκ°€ μ—†μœΌλ©΄ false λ°˜ν™˜
}
node = node.children[index]; // μžμ‹ λ…Έλ“œλ‘œ 이동
}
return node.isEndOfWord; // λ‹¨μ–΄μ˜ 끝인지λ₯Ό 확인
}

public boolean startsWith(String prefix) {
TrieNode node = root;
for (char c : prefix.toCharArray()) {
int index = c - 'a';
if (node.children[index] == null) {
return false; // ν•΄λ‹Ή μ ‘λ‘μ‚¬λ‘œ μ‹œμž‘ν•˜λŠ” 단어가 μ—†μœΌλ©΄ false λ°˜ν™˜
}
node = node.children[index]; // μžμ‹ λ…Έλ“œλ‘œ 이동
}
return true; // μ ‘λ‘μ‚¬λ‘œ μ‹œμž‘ν•˜λŠ” 단어가 있으면 true λ°˜ν™˜
}
}

// λ°±νŠΈλž˜ν‚ΉμœΌλ‘œ ν’€μ–΄λ΄€λŠ”λ°, 속도가 λ„ˆλ¬΄ μ•ˆλ‚˜μ™”μŒ
// O(n*m)의 μ‹œκ°„λ³΅μž‘λ„κ°€ λ‚˜μ˜΄. n은 κΈ€μžμˆ˜ m은 κΈ€μžκΈΈμ΄
class Trie {

private List<String> words;

public Trie() {
words = new ArrayList<>();
}

public void insert(String word) {
words.add(word);
}

public boolean search(String word) {
return backtrack(word, true);
}

public boolean startsWith(String prefix) {
return backtrack(prefix, false);
}

private boolean backtrack(String target, boolean exactMatch) {
for (String word : words) {
if (exactMatch) {
if (word.equals(target)) {
return true;
}
} else {
if (word.startsWith(target)) {
return true;
}
}
}
return false;
}
}
20 changes: 20 additions & 0 deletions word-break/imsosleepy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// dp λ°°μ—΄ (dp[i] = s[0...i]κ°€ λ‹¨μ–΄λ“€λ‘œ λ‚˜λˆ μ§ˆ 수 μžˆλŠ”μ§€ μ—¬λΆ€)
// μž…λ ₯ λ°μ΄ν„°μ˜ 크기가 크지 μ•Šμ•„μ„œ O(N^2)도 κ°€λŠ₯ν•œ 문제.
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Set<String> wordSet = new HashSet<>(wordDict);
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;

for (int i = 1; i <= s.length(); i++) {
for (int j = 0; j < i; j++) {
if (dp[j] && wordSet.contains(s.substring(j, i))) {
dp[i] = true;
break;
}
}
}

return dp[s.length()];
}
}

0 comments on commit c026aed

Please sign in to comment.