[parkhojeong] WEEK 07 Solutions - #2795
Conversation
๐ parkhojeong ๋์ ํ์ต ํํฉ์ด๋ฒ ์ฃผ ์ ์ถ ๋ฌธ์
๋์ ํ์ต ์์ฝ
๋ฌธ์ ํ์ด ํํฉ
๐ค ์ด ๋๊ธ์ GitHub App์ ํตํด ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค. ๐ข API ์ฌ์ฉ๋ (gpt-5-nano)
|
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
- ํจํด: Hash Map / Hash Set, Sliding Window
- ์ค๋ช : ๋ฌธ์์ด์์ ์ค๋ณต ๋ฌธ์๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ํด์ ๋งต์ผ๋ก ๋ฌธ์ ์์น๋ฅผ ์ถ์ ํ๊ณ , ์์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฐจ ์ด๋์ํค๋ ๋ฐฉ์์ผ๋ก ๋ถ๋ถ๋ฌธ์์ด ๊ธธ์ด๋ฅผ ์ต๋ํํ๋ค. ์ด๋ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ํจํด์ ๋ํ์ ์ธ ๊ตฌํ์ด๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(min(n, k)) |
ํผ๋๋ฐฑ: ๋ฌธ์ ์ธ๋ฑ์ค ์ ์ฅ์๋ฅผ ์ฌ์ฉํด ๊ฐ ๋ฌธ์ ๋ง์ง๋ง ์์น๋ฅผ ์ถ์ ํ๊ณ , ์ค๋ณต์ด ๋ฑ์ฅํ๋ฉด ์์ ์ธ๋ฑ์ค๋ฅผ ๊ฐฑ์ ํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
- ํจํด: Depth-First Search, Backtracking
- ์ค๋ช : ์ฌ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํ์ํ๋ฉฐ ์ฐ๊ฒฐ๋ '1'์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๋ DFS ํจํด์ด ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ ์ฌ์ ์์์ ์์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํด์ ์นด์ดํธํ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ดํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(rows * cols) |
| Space | O(rows * cols) |
ํผ๋๋ฐฑ: ๊ทธ๋ฆฌ๋์ ๋ชจ๋ ์์๋ฅผ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๊ณ , ์ฌ์ ์ฐ๊ฒฐ ์์๋ฅผ DFS๋ก ํ์ํ๋ค.
๊ฐ์ ์ ์: ์ฌ๊ท ๊น์ด๊ฐ ํฐ ์ ๋ ฅ์ ๋๋นํด ๋น์ฌ๊ท DFS๋ BFS๋ก ๊ตฌํํด ์คํ ์ค๋ฒํ๋ก๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด๋ณผ ์ ์์ต๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
- ํจํด: Two Pointers, Linked List
- ์ค๋ช : ์ฃผ์ด์ง ์ฝ๋๋ ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ญ์์ผ๋ก ๋ค์ง๊ธฐ ์ํด ๋ ํฌ์ธํฐ(prev, cur)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ ๋ ธ๋๋ฅผ ์ํํ๋ฉฐ ์ฐ๊ฒฐ ๋ฐฉํฅ์ ๋ฐ๊ฟ ๊ฐ๋ฉฐ ์งํํ๋ ๋ํ์ ํจํด์ ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ์ ํ ๋ ธ๋ ์ ๋ณด๋ฅผ ์์ ์ ์ฅํ๊ณ ํฌ์ธํฐ๋ฅผ ์ฐจ๋ก๋ก ๋ค์ง์ด๊ฐ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
- ํจํด: Depth-First Search, Greedy, Hash Map / Hash Set
- ์ค๋ช : ์ฝ๋๊ฐ DFS๋ก ๊ฐ ๋ฐฉํฅ์ผ๋ก ํ์ํ๋ฉฐ 0์ธ ์์น๋ฅผ ๋ง์ปค๋ก ํ์ํ ๋ค, ๋ง์ง๋ง์ ๋ค์ 0์ผ๋ก ๋ณต์ํฉ๋๋ค. ์ธ์ ํ 0์ ์์น๋ฅผ ํ์ํ๋ ๋ฐฉ์์ ํ์ ํจํด๊ณผ ํ๋๊ทธ ๋งํน์ ์กฐํฉ์ผ๋ก ๋ณด์ด๋ฉฐ, ๊ฐ๋จํ ๋ง์ปค๋ฅผ ์ฌ์ฉํ ํ์ ๊ธฐ๋ฒ์ด ๋๋ฌ๋ฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(m*n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๋ ๋จ๊ณ๋ก ๋๋ ์ ๋ก๋ฅผ ํ์ฐ์ํค๋ ๋ฐฉ์์ผ๋ก in-place ํด๊ฒฐ์ ์๋ํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
- ํจํด: Dynamic Programming, Greedy, Hash Map / Hash Set
- ์ค๋ช : ํน์ ์นธ์ ๊ฒฝ๋ก ์๋ฅผ ์์ชฝ๊ณผ ์ผ์ชฝ ์นธ์ ์์ ํฉ์ผ๋ก ๊ณ์ฐํ๋ DP ๋ฐฉ์์ผ๋ก ํด๋ฅผ ๊ตฌํฉ๋๋ค. ๊ฒน์น๋ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ ๊ทธ๋ฆฌ๋ ์ํ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ฑ์๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(m*n) |
| Space | O(m*n) |
ํผ๋๋ฐฑ: ์ผ์ชฝ ์์์ ์ค๋ฅธ์ชฝ ์๋๋ก ๊ฒฝ๋ก์ ์๋ฅผ ๋์ ํฉ์ผ๋ก ๊ตฌํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
์ด๊ฑฐ ์ฌ๊ท๋๋ฌธ์ ๊ณต๊ฐ๋ณต์ก๋ O(max(m, n)) ์ผํ
๋ฐ ํจํด๋ถ์์ด ์ด์ํ๊ฒ ๋์ด ์๋ค์
ํจ์ฌ ๊ฐ๋จํ ๊ณต๊ฐ๋ณต์ก๋ O(1) ํ์ด๋ ์์ด์!
There was a problem hiding this comment.
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
maze = [[1] * n for _ in range(m)]
for i in range(1, m):
for j in range(1, n):
maze[i][j] = maze[i - 1][j] + maze[i][j - 1]
return maze[m - 1][n - 1]
์นธ ์ฑ์ด๋ค๊ณ ์๊ฐํ์๋ฉด ๋ณต์กํ if ์์ด๋ ์ถฉ๋ถํ ๊ฐ๋ฅํ์ธ์!
๊ทธ๋ฆฌ๊ณ
- ๊ณต๊ฐ๋ณต์ก๋ O(n)
- ๊ณต๊ฐ๋ณต์ก๋ O(1)
์ธ ํ์ด๋ ์์ผ๋๊น ํด๋ณด์๋ฉด ์ข์๊ฒ ๊ฐ๋ค์
There was a problem hiding this comment.
O(1)์ผ๋ก๋ ํ์ด๋ณด๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
| row = [0] * m | ||
| grid = [row] * n |
There was a problem hiding this comment.
์ด ๋ถ๋ถ์ ์ด๋ ๊ฒ ๋ง๋์๋ฉด ๋์ผํ row ๊ฐ์ฒด์ ๋ ํผ๋ฐ์ค๊ฐ ํ์ ๊ฐ์๋งํผ ๋ฐ๋ณต๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ ํ์ ์ด ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋ค๋ฅธ ๋ชจ๋ ํ์ ๊ฐ๋ ํจ๊ป ๋ฐ๋๋ ๋์ฐธ์ฌ๊ฐ ์ผ์ด๋ ์ ์์ด์.
์๋ฅผ ๋ค๋ฉด ์๋ ์ฝ๋๋:
a = [0] * 5
b = [a] * 5
a[1] = 1
print(*b, sep="\n")๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋ ํ์ ๋ ๋ฒ์งธ ๊ฐ์ด ํจ๊ป ๋ณ๊ฒฝ๋ฉ๋๋ค.
[0, 1, 0, 0, 0]
[0, 1, 0, 0, 0]
[0, 1, 0, 0, 0]
[0, 1, 0, 0, 0]
[0, 1, 0, 0, 0]
๊ฐ ํ์ ๋ ๋ฆฝ์ ์ธ ๋ฆฌ์คํธ๋ก ๋ง๋ค๋ ค๋ฉด ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
grid = [[0] * m for _ in range(n)]๋ค๋ง ํ์ฌ ํ์ด๊ฐ ์ ์์ ์ผ๋ก ์๋ํ ์๋ฆฌ๋ 1์ฐจ์ DP๋ฅผ ํ์ฉํ๋ ๋ฐฉ์๊ณผ ์ ํํ ๋์ผํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ ๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ต์ ํํ๋ ์์ด๋์ด๋ ์์ฐ์ค๋ฝ๊ฒ ๋ ์ฌ๋ฆฌ์ค ์ ์์ ๊ฒ ๊ฐ์์!
There was a problem hiding this comment.
์ง์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ฐ๋์ฉ ์ค์ํ๋ ๋ถ๋ถ์ธ๋ฐ ์ฐ์ฐํ ํต๊ณผ๋๋ค์. ํ ์นผ๋ผ์ฉ ๊ณ์ฐํ๋ ๋ฐฉ์์ผ๋ก ํ์ด ์ ๋ฐ์ดํธ ํด๋ณด์์ต๋๋ค.
| prev, cur = None, head | ||
|
|
||
| while cur: | ||
| next = cur.next |
There was a problem hiding this comment.
next๋ ํ์ด์ฌ ๋ด์ฅ ํจ์๋ ์ด๋ฆ์ด ๊ฒน์ณ์ ( ์๋ง leetcode์์๋ ์์์ผ๋ก ๋ค๋ฅด๊ฒ ๋ณด์ด์ค๊ฑฐ์์ )
์ฌ์ฉ์ ์์ ํ์๋๊ฒ ์ด๋ ์ค๊น ์ถ์ต๋๋ค.
There was a problem hiding this comment.
๊ฐ์ฌํฉ๋๋ค. ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝ ํด์ฃผ์์ต๋๋ค.
| if matrix[row][col] == 0: | ||
| return | ||
|
|
||
| matrix[row][col] = MARKER |
There was a problem hiding this comment.
ํ์ด์ฌ์ด๋ผ ๊ฐ๋ฅํ๋ค์ง๋ง, ์ ์ ํ๋ ฌ์ ๋ฌธ์์ด์ ๋ฃ๋๊ฒ์ ์ข ๋ณ๋ก์ด์ง ์์๊น ์ถ์ต๋๋ค.
There was a problem hiding this comment.
๊ฐ์ ํ์ ์ค ์ ๋ ฅ ๊ฐ ๋ฒ์์ ํด๋นํ์ง ์๋ sys.maxsize ์ฐ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
There was a problem hiding this comment.
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if len(s) == 0:
return 0
ch_to_idx = {}
start_idx = 0
i = 0
length_of_longest_substring = 1
for i, ch in enumerate(s):
if ch in ch_to_idx and ch_to_idx[ch] >= start_idx:
start_idx = ch_to_idx[ch] + 1
ch_to_idx[ch] = i
length_of_longest_substring = max(i - start_idx + 1, length_of_longest_substring)
return length_of_longest_substring
์ ์๊ฐ์ ans๋ฅผ ๊ตฌํ๋๊ฒ์ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ๋ถ๊ธฐ์ ๊ณตํต๋ก์ง์ด ๋ง์๊ฒ ๋ณด๋ค๋ ์ด๋ ๊ฒ
๊ฒฝ์ฐ๋ฅผ ํฌ๊ฒ ๋ฐ์ง์ง ์๊ณ ์ ๋ถ ํ๋๊ฒ ๊ฐ๋ ์ฑ์ด ์ข์ง ์์๊น ๋ผ๋ ์๊ฒฌ์ด ์์ต๋๋ค.
2๊ฐ์ ํญ๋ชฉ์ ๊ฐ์ง๋ max ํจ์๋ O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ O(N) ๋ฃจํ ์์ ๋๋ ค๋ ํฐ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ์์๊ฒ์ผ๋ก ๋ณด์ฌ์์
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
longest-substring-without-repeating-characters/parkhojeong.py
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if s == "":
return 0
ch_to_idx = {}
start_idx = 0
i = 0
length_of_longest_substring = 1
for i in range(len(s)):
ch = s[i]
if ch in ch_to_idx and ch_to_idx[ch] >= start_idx:
start_idx = ch_to_idx[ch] + 1
ch_to_idx[ch] = i
else:
ch_to_idx[ch] = i
length_of_substring = i - start_idx + 1
length_of_longest_substring = max(length_of_longest_substring, length_of_substring)
return length_of_longest_substring
- ํจํด: Hash Map / Hash Set, Sliding Window
- ์ค๋ช : ๋ฌธ์์ด ๋ถ๋ถ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๊ธฐ ์ํด ํ์ฌ ์ฐฝ์ ์์ ์ง์ ์ ์ด๋์ํค๋ฉฐ ๊ฐ ๋ฌธ์ ์์น๋ฅผ ํด์๋งต์ผ๋ก ์ถ์ ํ๋ ๋ฐฉ์์ผ๋ก, ์ฐฝ์ ํฌ๊ธฐ๋ฅผ ์ฐ์์ ์ผ๋ก ์กฐ์ ํ๋ Sliding Window์ ํด์๋งต์ ์ด์ฉํ ์ค๋ณต ๋ฌธ์ ๊ด๋ฆฌ๊ฐ ํต์ฌ ํจํด์ ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(min(n, ฯ)) |
ํผ๋๋ฐฑ: ํด์๋งต์ผ๋ก ๋ง์ง๋ง ๋ฑ์ฅ ์ธ๋ฑ์ค๋ฅผ ์ถ์ ํ๊ณ ์๋์ฐ ์์์ ์ ์ค๋ณต ๋ฌธ์์ ์ด์ ์์น๋ก ๊ฐฑ์ ํ๋ค. ๊ทธ๋ฌ๋ length_of_longest_substring ์ด๊ธฐ๊ฐ๊ณผ ๋ถ๋ถ ๋ฌธ์์ด ๊ธธ์ด ๊ณ์ฐ ๋ก์ง์์ ํผ์ ์ด ์์ด ์คํ ์ค ์ผ๋ถ ๊ฒฝ์ฐ์ ์๋ชป๋ ์ ์๋ค.
๊ฐ์ ์ ์: ์ด๊ธฐ๊ฐ๊ณผ ๊ธธ์ด ๊ณ์ฐ ๋ก์ง์ ๋ช ํํ ํ์ฌ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋๋ก ์์ ํ๋ฉด ์์ ์ ์ด๋ค. ์๋ฅผ ๋ค์ด length_of_substring ๋ณ์๋ฅผ ํญ์ i - start_idx + 1๋ก ๊ณ์ฐํ๊ณ , ์๋ก์ด ์ค๋ณต ๋ฐ๊ฒฌ ์ start_idx๋ฅผ ์ ๋ฐ์ดํธํ ๋ค ์ต์ฅ ๊ธธ์ด๋ฅผ ๋ฐ์.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
number-of-islands/parkhojeong.py
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
row_len = len(grid)
col_len = len(grid[0])
def dfs(row: int, col: int):
if not (0 <= row < row_len and 0 <= col < col_len):
return
if grid[row][col] == "0":
return
grid[row][col] = "0"
dfs(row - 1, col)
dfs(row + 1, col)
dfs(row, col - 1)
dfs(row, col + 1)
num_islands = 0
for row in range(row_len):
for col in range(col_len):
if grid[row][col] == "1":
num_islands += 1
dfs(row, col)
return num_islands- ํจํด: DFS
- ์ค๋ช : DFS๋ฅผ ์ด์ฉํด ์ธ์ ํ ๋ ('1')์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๋ฉฐ ์ฌ์ ์๋ฅผ ์ธ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์์ต๋๋ค. ์ฌ๊ท๋ฅผ ํตํด ์ํ์ข์ฐ๋ก ์ฐ๊ฒฐ๋ ์์ญ์ ํ์ํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(rows * cols) |
| Space | O(rows * cols) |
ํผ๋๋ฐฑ: ์ ํ์ ์ธ DFS ๊ธฐ๋ฐ ์ฌ ํ์์ผ๋ก ๋ชจ๋ ์ ์ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๋ค. ์ฌ๊ท ๊น์ด๊ฐ ํฌ๊ฒ ์ฆ๊ฐํ๋ฉด ์คํ ์ค๋ฒํ๋ก ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๊ฐ์ ์ ์: ์ฌ๊ท ๋์ ๋ช ์์ ์คํ์ ์ฌ์ฉํ DFS๋ BFS๋ก ๊ตฌํํ๋ฉด ์คํ ๊น์ด ๋ฌธ์ ๋ฅผ ํผํ ์ ์๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
reverse-linked-list/parkhojeong.py
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
prev_node, cur_node = None, head
while cur_node:
next_node = cur_node.next
cur_node.next = prev_node
prev_node, cur_node = cur_node, next_node
return prev_node- ํจํด: Two Pointers, Linked List
- ์ค๋ช : head ํฌ์ธํฐ์ prev ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด ๋ฆฌ์คํธ๋ฅผ ์ญ์์ผ๋ก ์ํํ๋ฉฐ ๋งํฌ๋ฅผ ๋ค์ง๋ ์ ํ์ ์ธ ํจํด์ผ๋ก, ๋ ํฌ์ธํฐ๋ฅผ ํ์ฉํ ์์ ๋ฐ์ (Reverse) ์์ ์ด๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ์ถ๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ด ๋งํฌ๋ฅผ ๋ค์ง์ด ๋๊ฐ๋ ํ์ค ๋ฐฉ๋ฒ์ด๋ค.
๊ฐ์ ์ ์: ํน๋ณํ ๊ฐ์ ํ์ ์์ผ๋ฉฐ ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ธ๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
set-matrix-zeroes/parkhojeong.py
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
row_len = len(matrix)
col_len = len(matrix[0])
MARKER = "#"
def dfs(row, col, d_row, d_col):
if not (0 <= row < row_len and 0 <= col < col_len):
return
if matrix[row][col] == 0:
return
matrix[row][col] = MARKER
dfs(row + d_row, col + d_col, d_row, d_col)
for row in range(row_len):
for col in range(col_len):
if matrix[row][col] == 0:
matrix[row][col] = MARKER
dfs(row + 1, col, 1, 0)
dfs(row - 1, col, -1, 0)
dfs(row, col + 1, 0, 1)
dfs(row, col - 1, 0, -1)
for row in range(row_len):
for col in range(col_len):
if matrix[row][col] == MARKER:
matrix[row][col] = 0- ํจํด: Depth-First Search, Greedy
- ์ค๋ช : ์ฝ๋๋ ๊ฐ 0์ธ ์์๋ฅผ ์ค์ฌ์ผ๋ก ์ธ์ ํ ๋น์ ๋ก ๊ฐ์ MARKER๋ก ํ์ํ๋ฉฐ DFS๋ก ์ฐ๊ฒฐ ๊ฒฝ๋ก๋ฅผ ํ์ํด 0์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ ์ฒด์ ์ผ๋ก๋ ์ฐ๊ฒฐ ํ์๊ณผ ํ์ ํ ์ฌ์ฒ๋ฆฌ์ ํ๋ฆ์ด๋ฏ๋ก DFS์ ๊ฐ๋จํ ํ์ ์ ๋ต์ด ํต์ฌ ํจํด์ ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(rows * cols) |
| Space | O(rows * cols) |
ํผ๋๋ฐฑ: ํ์ฌ ๊ตฌํ์ ๋ง์ปค๋ก DFS๋ฅผ ํ์ฉํด ์ฐ์์ ์ผ๋ก 0์ผ๋ก ๋ฐ๊พธ๋ ๋นํจ์จ์ ๊ตฌ์กฐ๋ฅผ ๋ณด์ธ๋ค. ์ฌ๋ฌ ๋ฐฉํฅ์ผ๋ก ํ์ฐ์ํค๋ DFS๊ฐ ํ์ ์ด์์ผ๋ก ์ค๋ณต ๋ฐฉ๋ฌธ์ ์ ๋ฐํ ์ ์๋ค.
๊ฐ์ ์ ์: ํ์ค ์ ๊ทผ์ธ ์ฒซ ํต๊ณผ์์ ํ/์ด ๋ฐฐ์ด์ ํ๋๊ทธ๋ฅผ ๋จ๊ฒจ ๋๊ณ , ํ์ฒ๋ฆฌ์์ 0์ผ๋ก ๋ฐ๊พธ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ฉด ๊ฐ๋จํ๊ณ ๋ช ํํ๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
unique-paths/parkhojeong.py
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
column = [1] * m
for col in range(n - 1):
for row in range(1, m):
column[row] = column[row] + column[row - 1]
return column[-1]- ํจํด: Dynamic Programming, Greedy
- ์ค๋ช : 2์ฐจ์ ๊ฒฉ์์์์ ๊ฒฝ๋ก ์๋ฅผ ์ด๊ณผ ํ์ ํฉ์ผ๋ก ๊ฐฑ์ ํ๋ DP ์์ด๋์ด๋ก, ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ ์ํด 1์ฐจ์ ๋ฐฐ์ด์ ํ์ฉํ๋ ํจํด์ ๋๋ค. ๊ฒฝ๋ก์ ํฉ ๊ท์น์ ์ด์ฉํ ์ ํ์์ ์ ํ์ ์์์ ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(m * n) |
| Space | O(m) |
ํผ๋๋ฐฑ: 1์ฐจ์ DP ๋ฐฐ์ด๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ํํ ์ ์ ์ข๋ค.
๊ฐ์ ์ ์: ๋ช ํ์ฑ์ ์ํด ์ฃผ์์ผ๋ก ์ ํ์์ ์ถ๊ฐํ๋ฉด ์ดํด๋๊ฐ ์์นํ๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
set-matrix-zeroes/parkhojeong.py
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
row_len = len(matrix)
col_len = len(matrix[0])
MARKER = sys.maxsize
def dfs(row, col, d_row, d_col):
if not (0 <= row < row_len and 0 <= col < col_len):
return
if matrix[row][col] == 0:
return
matrix[row][col] = MARKER
dfs(row + d_row, col + d_col, d_row, d_col)
for row in range(row_len):
for col in range(col_len):
if matrix[row][col] == 0:
matrix[row][col] = MARKER
dfs(row + 1, col, 1, 0)
dfs(row - 1, col, -1, 0)
dfs(row, col + 1, 0, 1)
dfs(row, col - 1, 0, -1)
for row in range(row_len):
for col in range(col_len):
if matrix[row][col] == MARKER:
matrix[row][col] = 0- ํจํด: Depth-First Search, Backtracking
- ์ค๋ช : ์ฝ๋๊ฐ ๊ฐ 0์ธ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ํ์ข์ฐ๋ก ํ์ํ๋ฉฐ ์ธ์ ์์๋ฅผ ํ์ํ๋ DFS ํ๋ฆ์ ์ฌ์ฉํ๊ณ , ํ์๋ ๊ฐ์ ๋์ค์ 0์ผ๋ก ๋๋๋ฆฌ๋ ๋ฐฉ์์ด Backtracking ์ฑ๊ฒฉ๊ณผ DFS ํจํด์ ํจ๊ป ๋ณด์ ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n*m) |
| Space | O(n*m) |
ํผ๋๋ฐฑ: 0์ด ์๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธ์ ๋ฐฉํฅ์ผ๋ก ํ์ํด MARKER๋ฅผ ๊ฑฐ์ณ ๊ฐ์ ์ ์ผ๋ก ํ์ํ๋ค. ํ์ง๋ง ๋ชจ๋ 0์ ์ฐพ๊ณ ๋ง์ปค ์ฒ๋ฆฌ๊น์ง ๊ฐ๋ฅํ๋ฏ๋ก ์ด ์๊ฐ์ ์ด์ค ๋ฃจํ๋ก ๊ฒฐ์ ๋๊ณ ๊ณต๊ฐ์ ์ถ๊ฐ ๋ฐฐ์ด ์์ด ๋ง์ปค๋ฅผ ์ฌ์ฉํด ๊ตฌํํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ in-place ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋, O(1) ์ถ๊ฐ ๊ณต๊ฐ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ํ/์ด ๋ง์ปค๋ฅผ ๋ฐ๋ก ๋์ง ์๊ณ ์ฒซ ์ค์์ ์ฒ๋ฆฌ ์ฌ๋ถ๋ฅผ ์ถ์ ํ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
๋ต์ ์ ์ถ ๋ฌธ์
์์ฑ์ ์ฒดํฌ ๋ฆฌ์คํธ
In Review๋ก ์ค์ ํด์ฃผ์ธ์.๊ฒํ ์ ์ฒดํฌ ๋ฆฌ์คํธ
Important
๋ณธ์ธ ๋ต์ ์ ์ถ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ถ PR ํ๋ ์ด์์ ๋ฐ๋์ ๊ฒํ ๋ฅผ ํด์ฃผ์ ์ผ ํฉ๋๋ค!