From 7da1b8529c5e109984a400f55eeeff582492bd7f Mon Sep 17 00:00:00 2001 From: ChaedongIm Date: Sun, 19 Jan 2025 09:43:47 +0900 Subject: [PATCH 1/5] feat: [Week 07-1] solve reverse-linked-list --- reverse-linked-list/Chaedie.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 reverse-linked-list/Chaedie.py diff --git a/reverse-linked-list/Chaedie.py b/reverse-linked-list/Chaedie.py new file mode 100644 index 000000000..c368ee95f --- /dev/null +++ b/reverse-linked-list/Chaedie.py @@ -0,0 +1,21 @@ +""" +Solution: + 1) next node를 저장합니다. + 2) cur node 를 prev node 로 연결시킵니다. + 3) cur node 가 prev node 가 됩니다. + 4) cur node 는 next node 가 됩니다. +Time: O(n) +Space: O(1) +""" + + +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + prev = None + cur = head + while cur: + next = cur.next + cur.next = prev + prev = cur + cur = next + return prev From 312e41297b699108690ea6ad119ab8208d4a28a8 Mon Sep 17 00:00:00 2001 From: ChaedongIm Date: Tue, 21 Jan 2025 18:55:05 +0900 Subject: [PATCH 2/5] feat: [Week 07-2] solve Longest Repeating Character Replacement --- .../Chaedie.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 longest-substring-without-repeating-characters/Chaedie.py diff --git a/longest-substring-without-repeating-characters/Chaedie.py b/longest-substring-without-repeating-characters/Chaedie.py new file mode 100644 index 000000000..2d8185449 --- /dev/null +++ b/longest-substring-without-repeating-characters/Chaedie.py @@ -0,0 +1,22 @@ +""" +Solution: + 1) for iteration 을 도는 동안 hash set 을 이용해 처음 발견한 원소들을 window set에 넣는다. + 2) 중복되는 원소를 발견할 경우 해당 원소의 중복이 사라질때까지 left side 의 원소들을 하나씩 제거한다. + +Time: O(n^2) = O(n) (for iteration) * O(n) 최악의 경우 n만큼의 중복제거 +Space: O(n) (모든 원소가 set에 들어갈 경우) +""" + + +class Solution: + def lengthOfLongestSubstring(self, s: str) -> int: + window = set() + max_len = 0 + l = 0 + for r in range(len(s)): + while s[r] in window: + window.remove(s[l]) + l += 1 + window.add(s[r]) + max_len = max(max_len, len(window)) + return max_len From 2c79e1087e6c479c5692b4a73799fae6c372b258 Mon Sep 17 00:00:00 2001 From: ChaedongIm Date: Tue, 21 Jan 2025 19:06:35 +0900 Subject: [PATCH 3/5] feat: [Week 07-3] solve Number of Islands --- number-of-islands/Chaedie.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 number-of-islands/Chaedie.py diff --git a/number-of-islands/Chaedie.py b/number-of-islands/Chaedie.py new file mode 100644 index 000000000..95e6be18c --- /dev/null +++ b/number-of-islands/Chaedie.py @@ -0,0 +1,31 @@ +""" +Solution: + 1) for 문을 돌면서 섬(1)인 경우 result 에 1을 더하고 dfs를 돌린다. + 2) dfs 를 통해 섬 전체를 순회하며 0으로 만들어준다. + 3) 섬의 갯수 result 를 return 한다. + +육지의 갯수 n +Time: O(n) n회의 dfs 함수 실행 될 수 있음 +Space: O(n) n의 호출스택이 사용 될 수 있음 +""" + + +class Solution: + def numIslands(self, grid: List[List[str]]) -> int: + ROWS, COLS = len(grid), len(grid[0]) + result = 0 + + def dfs(i, j): + if i < 0 or i >= ROWS or j < 0 or j >= COLS or grid[i][j] == "0": + return + grid[i][j] = "0" + for dx, dy in [(0, 1), (0, -1), (-1, 0), (1, 0)]: + dfs(i + dx, j + dy) + + for i in range(ROWS): + for j in range(COLS): + if grid[i][j] == "1": + dfs(i, j) + result += 1 + + return result From bde92aec13b9d489d2047d1243472bc87a39c607 Mon Sep 17 00:00:00 2001 From: ChaedongIm Date: Tue, 21 Jan 2025 19:27:14 +0900 Subject: [PATCH 4/5] feat: [Week 07-4] solve Unique Paths --- unique-paths/Chaedie.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 unique-paths/Chaedie.py diff --git a/unique-paths/Chaedie.py b/unique-paths/Chaedie.py new file mode 100644 index 000000000..7bd0bc4c0 --- /dev/null +++ b/unique-paths/Chaedie.py @@ -0,0 +1,33 @@ +""" +1 0 0 0 0 0 0 +0 0 0 0 0 0 0 +0 0 0 0 0 0 0 + +Solution: + 1) grid에서 0,0을 제외하곤 도달할 수 있는 방법이 left way + upper way 갯수밖에 없다고 생각했다. + 2) 따라서 grid를 순회하며 grid index의 경계를 넘어가지 않을 경우 left way + upper way 갯수를 더해주었다. + 3) 마지막 grid의 우하단의 값을 return 해주었습니다. +Time: O(mn) (원소의 갯수) +Space: O(mn) (원소의 갯수) +""" + + +class Solution: + def uniquePaths(self, m: int, n: int) -> int: + dp = [] + for i in range(m): + dp.append([0] * n) + print(dp) + + for i in range(m): + for j in range(n): + if i == 0 and j == 0: + dp[i][j] = 1 + continue + + up_value = 0 if i - 1 < 0 or i - 1 >= m else dp[i - 1][j] + left_value = 0 if j - 1 < 0 or j - 1 >= n else dp[i][j - 1] + + dp[i][j] = up_value + left_value + + return dp[m - 1][n - 1] From 7cbc7148a23ab080a89ca6cf638154bfb5d495e0 Mon Sep 17 00:00:00 2001 From: ChaedongIm Date: Tue, 21 Jan 2025 20:36:13 +0900 Subject: [PATCH 5/5] feat: [Week 07-5] solve Set Matrix Zeroes --- set-matrix-zeroes/Chaedie.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 set-matrix-zeroes/Chaedie.py diff --git a/set-matrix-zeroes/Chaedie.py b/set-matrix-zeroes/Chaedie.py new file mode 100644 index 000000000..be9e05eb9 --- /dev/null +++ b/set-matrix-zeroes/Chaedie.py @@ -0,0 +1,31 @@ +""" +Solution: + 1) matrix를 순회하면서 0을 찾는다. + 2) 0일 경우 rows, cols set에 각 인덱스를 넣는다. + 3) rows, cols 를 순회하면서 해당하는 row, col을 0으로 만들어준다. +Time: O(nm) = O(nm) (순회) + 최대 O(nm) + 최대 O(nm) +Space: O(n + m) +""" + + +class Solution: + def setZeroes(self, matrix: List[List[int]]) -> None: + """ + Do not return anything, modify matrix in-place instead. + """ + ROWS, COLS = len(matrix), len(matrix[0]) + rows = set() + cols = set() + for i in range(ROWS): + for j in range(COLS): + if matrix[i][j] == 0: + rows.add(i) + cols.add(j) + + for i in rows: + for j in range(COLS): + matrix[i][j] = 0 + + for j in cols: + for i in range(ROWS): + matrix[i][j] = 0