Skip to content

Commit 8eefff0

Browse files
authored
Merge pull request #2566 from liza0525/main
[liza0525] WEEK 08 Solutions
2 parents f58e23d + c8b2d2a commit 8eefff0

6 files changed

Lines changed: 194 additions & 0 deletions

File tree

โ€Žclone-graph/liza0525.pyโ€Ž

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from typing import Optional
2+
3+
# 7๊ธฐ ํ’€์ด
4+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(V + E)
5+
# - ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ˆ˜์™€ ๋ชจ๋“  ์—ฃ์ง€์˜ ์ˆ˜๋งŒํผ ํƒ๋ฐฉํ•˜๋ฏ€๋กœ ๊ทธ๋งŒํผ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ(V: ๋…ธ๋“œ ์ˆ˜, E: ์—ฃ์ง€ ์ˆ˜)
6+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(V)
7+
# - memo์— ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์ถ”๊ฐ€(V: ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜)
8+
class Solution:
9+
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
10+
memo = {}
11+
12+
def copy_graph(node):
13+
if not node:
14+
# ๋”์ด์ƒ ๋ณต์‚ฌํ•  ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด None์„ return
15+
return None
16+
17+
if node.val in memo:
18+
# node์˜ ๊ฐ’์ด memo์— ์žˆ๋‹ค๋ฉด memo์— ์žˆ๋Š” ๊ฐ’์„ return
19+
return memo[node.val]
20+
21+
# Node์˜ ๋ณต์‚ฌ๋ฅผ ์œ„ํ•ด ์ƒˆ ๋…ธ๋“œ ์ƒ์„ฑ ๋ฐ node.val ๊ฐ’์„ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์ž…๋ ฅ
22+
res_node = Node(node.val)
23+
memo[node.val] = res_node # memo์— ์ƒˆ๋กœ๋งŒ๋“  ๊ฐ์ฒด๋ฅผ value๋กœ ํ•˜์—ฌ ์ €์žฅ(key๋Š” node.val ๊ฐ’์œผ๋กœ)
24+
25+
# neighbors๋„ ๋ณต์‚ฌ, ์ด ๋•Œ copy_graph๋ฅผ ์žฌ๊ท€๋กœ ํ˜ธ์ถœํ•˜์—ฌ ๋ชจ๋“  neighbors๋“ค์„ ๋ณต์‚ฌํ•˜๋„๋ก ํ•œ๋‹ค.
26+
res_node.neighbors = [
27+
copy_graph(neighbor) for neighbor in node.neighbors
28+
]
29+
30+
# res_node๋ฅผ return
31+
return res_node
32+
33+
return copy_graph(node)# ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒŒ์ด์ฌ์˜ built-in ํ•จ์ˆ˜์ธ deepcopy๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ”๋กœ ๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฌ๊ธฐ๋„ ํ–ˆ๋‹ค.
34+
35+
36+
# ์ •๋ฆฌ ๋ชฉ์ 
37+
# ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒŒ์ด์ฌ์˜ built-in ํ•จ์ˆ˜์ธ deepcopy๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ”๋กœ ๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฌ๊ธฐ๋„ ํ–ˆ๋‹ค.
38+
# ์‹ค์ œ deepcopy ๊ตฌํ˜„์ด memo๋ฅผ ์ด์šฉํ•˜๋ฉฐ
39+
# copier์˜ deepcopy๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์žฌ๊ท€์™€ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค
40+
# ref: https://github.com/python/cpython/blob/main/Lib/copy.py
41+
from copy import deepcopy
42+
43+
44+
class Solution:
45+
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
46+
return deepcopy(node)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# 7๊ธฐ ํ’€์ด
2+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n * m)
3+
# - text1์˜ ๊ธธ์ด n๊ณผ text2์˜ ๊ธธ์ด m๋งŒํผ ์ˆœํšŒํ•˜๋ฉฐ ๊ณ„์‚ฐํ•จ
4+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n * m)
5+
# - text1์˜ ๊ธธ์ด n๊ณผ text2์˜ ๊ธธ์ด m๋งŒํผ์˜ 2์ฐจ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด DP ๊ณ„์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ
6+
class Solution:
7+
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
8+
dp = [
9+
[0 for _ in range(len(text2) + 1)]
10+
for _ in range(len(text1) + 1)
11+
]
12+
13+
for i in range(1, len(text1) + 1):
14+
for j in range(1, len(text2) + 1):
15+
if text1[i - 1] == text2[j - 1]:
16+
# text1์˜ i๋ฒˆ์งธ ๋ฌธ์ž์™€ text2์˜ j๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ๊ฐ™๋‹ค๋ฉด
17+
# ์ด ๋ฌธ์ž๋Š” ๊ณตํ†ต subsequence์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
18+
# ๋‘ ๋ฌธ์ž๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€(dp[i-1][j-1])์— 1์„ ๋”ํ•œ ๊ฐ’์ด ํ˜„์žฌ์˜ LCS ๊ธธ์ด๊ฐ€ ๋œ๋‹ค
19+
dp[i][j] = dp[i - 1][j - 1] + 1
20+
else:
21+
# ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ์™ธํ–ˆ์„ ๋•Œ์˜ LCS ์ค‘ ๋” ํฐ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค
22+
# dp[i][j-1]: text2์˜ j๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ์ œ์™ธํ•œ ๊ฒฝ์šฐ
23+
# dp[i-1][j]: text1์˜ i๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ์ œ์™ธํ•œ ๊ฒฝ์šฐ
24+
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
25+
26+
return dp[-1][-1]
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from collections import defaultdict
2+
3+
4+
# 7๊ธฐ ํ’€์ด
5+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
6+
# - right๋Š” ๋งค ๋ฃจํ”„๋งˆ๋‹ค ์ „์ง„ํ•˜๊ณ  left๋„ ์ตœ๋Œ€ n๋ฒˆ ์ „์ง„ํ•˜๋ฏ€๋กœ ํ•ฉ์ณ์„œ O(n)
7+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
8+
# - s์— ์žˆ๋Š” ๋ฌธ์ž๋“ค์˜ ๊ฐœ์ˆ˜๋งŒํผ ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒ ์ง€๋งŒ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž์ธ ์•ŒํŒŒ๋ฒณ๋งŒ์ด key๋กœ ๋“ค์–ด์˜ค๋ฏ€๋กœ ์ตœ๋Œ€ 26๊ฐœ
9+
class Solution:
10+
# ๊ธฐ๋ณธ ์•„์ด๋””์–ด: ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ
11+
# ์œˆ๋„์šฐ ๋‚ด์— ๊ฐ€์žฅ ๋งŽ์ด ์žˆ๋Š” ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜์™€ k๊ฐ’์„ ๋”ํ•œ ๊ฐ’์ด ์œˆ๋„์šฐ๋ฅผ ์ดˆ๊ณผํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ํ™•์ธ
12+
def characterReplacement(self, s: str, k: int) -> int:
13+
left = 0 # ์œˆ๋„์šฐ ์™ผ์ชฝ ์ธ๋ฑ์Šค ๊ฐ’
14+
max_len = 0 # ๋ฌธ์ œ์˜ ๋‹ต(๋ณ€๊ฒฝ ์‹œ ๊ฐ€์žฅ ๊ธด substring ๊ธธ์ด)
15+
char_dict = defaultdict(int) # ์œˆ๋„์šฐ ๋‚ด์˜ ๊ฐ ๋ฌธ์ž๋“ค ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ dict
16+
max_char_cnt = 0 # ์œˆ๋„์šฐ ๋‚ด์— ๊ฐ€์žฅ ๋งŽ์€ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜ ๊ทธ ์ž์ฒด(dict์˜ value() ๋ฉ”์„œ๋“œ๋ฅผ ๋งค๋ฒˆ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ)
17+
18+
for right in range(len(s)): # ์œˆ๋„์šฐ ์˜ค๋ฅธ์ชฝ ์ธ๋ฑ์Šค ๊ฐ’
19+
char_dict[s[right]] += 1 # ์˜ค๋ฅธ์ชฝ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž(์˜ˆ: A)์— ๋Œ€ํ•œ ๊ฐœ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์˜ฌ๋ฆผ
20+
max_char_cnt = max(max_char_cnt, char_dict[s[right]]) # ํ˜„์žฌ ์œˆ๋„์šฐ์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธ
21+
22+
if max_char_cnt + k >= right - left + 1:
23+
# ๊ฐ€์žฅ ๋งŽ์€ ๋ฌธ์ž์—ด ์‚ฌ์ด์— ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฌธ์ž๋“ค์˜ ๊ฐœ์ˆ˜๊ฐ€ k๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
24+
# -> ์œˆ๋„์šฐ ๋‚ด์—์„œ ๊ฐ€์žฅ ๊ธด repeating substring์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
25+
max_len = max(max_len, right - left + 1)
26+
else:
27+
# ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด left์˜ ๋ฌธ์ž๋ฅผ char_dict๋กœ๋ถ€ํ„ฐ ํ•˜๋‚˜ ์ค„์ด๊ณ 
28+
# left๋ฅผ ํ•˜๋‚˜ ์˜ฎ๊ธด๋‹ค(์ƒˆ๋กœ์šด ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ์˜๋ฏธ)
29+
char_dict[s[left]] -= 1
30+
left += 1
31+
32+
return max_len
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# 7๊ธฐ ํ’€์ด
2+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n ** 2)
3+
# - for๋ฌธ์œผ๋กœ ๋ฌธ์ž์˜ ์ค‘์‹ฌ์„ ํƒ์ƒ‰ * while๋ฌธ์œผ๋กœ ์–‘์ชฝ์œผ๋กœ ๋ป—์–ด๋‚˜๊ฐ€๋ฉฐ ๋ฌธ์ž์—ด ํƒ์ƒ‰
4+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
5+
# - ๋ณ€์ˆ˜ ๋ช‡ ๊ฐœ๋งŒ ์‚ฌ์šฉ
6+
class Solution:
7+
# ํ•ด๋‹น ๋ฌธ์ œ์˜ ๊ธฐ๋ณธ ์•„์ด๋””์–ด: ์ค‘์‹ฌ ํ™•์žฅ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ํŽ ๋ฆฐ๋“œ๋กฌ ์ฐพ๊ธฐ
8+
def countSubstrings(self, s: str) -> int:
9+
res = 0
10+
11+
# ํŽ ๋ฆฐ๋“œ๋กฌ์˜ ๊ธธ์ด๊ฐ€ ์ง์ˆ˜์ผ ์ˆ˜๋„ ํ™€์ˆ˜์ผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
12+
# 2 * len(s)๋ฅผ ๋Œ๊ณ  ๋‚˜๋ˆˆ ์ˆ˜ ๋ชซ์„ ์ด์šฉํ•ด์„œ ์ค‘์‹ฌ์„ ๋จผ์ € ์žก๋Š”๋‹ค
13+
for idx in range(2 * len(s) - 1):
14+
# ํŽ ๋ฆฐ๋“œ๋กฌ ๊ธธ์ด๊ฐ€ ์ง์ˆ˜์ผ ๋•Œ๋Š” left์™€ right์˜ ๊ฐ’์ด 1 ์ฐจ์ด๋‚˜์ง€๋งŒ
15+
# ํ™€์ˆ˜์ผ ๋•Œ๋Š” left == right ์ด๋‹ค.
16+
left = idx // 2
17+
right = (idx + 1) // 2
18+
delta = 0
19+
20+
while (
21+
0 <= left - delta # ์™ผ์ชฝ์œผ๋กœ ํ™•์žฅํ–ˆ์„ ๋•Œ์˜ index์™€
22+
and right + delta < len(s) # ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ™•์žฅํ–ˆ์„ ๋•Œ์˜ index๊ฐ€ ๋ชจ๋‘ s๊ธธ์ด ๋ฒ”์œ„ ๋‚ด์— ์žˆ์–ด์•ผ ํ•จ
23+
):
24+
if s[left - delta] == s[right + delta]: # ๋‘ ๊ฐœ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ํŽ ๋ฆฐ๋“œ๋กฌ
25+
res += 1 # ๊ฒฐ๊ณผ ๊ฐ’์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๊ณ 
26+
delta += 1 # ํ™•์žฅ์„ ์œ„ํ•œ ๊ฐ’์„ 1 ์˜ฌ๋ ค์ค€๋‹ค
27+
else:
28+
# ํ™•์žฅํ–ˆ์„ ๋•Œ์˜ ์–‘ ์ชฝ ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ํŽ ๋ฆฐ๋“œ๋กฌ์ด ์•„๋‹ˆ๋ฏ€๋กœ breakํ•˜๊ณ 
29+
# ๋‹ค์Œ ๋ฃจํ”„์—์„œ ์ƒˆ๋กœ์šด ์ค‘์‹ฌ์„ ์žก์€ ํ›„ ๋‹ค์‹œ ํŽ ๋ฆฐ๋“œ๋กฌ์„ ์ฐพ๋Š”๋‹ค.
30+
break
31+
32+
return res

โ€Žreverse-bits/liza0525.pyโ€Ž

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 7๊ธฐ ํ’€์ด
2+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(1)
3+
# - ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์กฐ๊ฑด ์ž์ฒด๊ฐ€ 32์ž๋ฆฟ์ˆ˜๋กœ ๋˜์–ด ์žˆ์–ด ์ตœ๋Œ€ 32๋ฒˆ๊นŒ์ง€๋งŒ ๊ณ„์‚ฐ
4+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
5+
# - result, idx์™€ ๊ฐ™์€ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ
6+
class Solution:
7+
def reverseBits(self, n: int) -> int:
8+
result = 0
9+
idx = 0 # ์ž๋ฆฟ์ˆ˜ ๊ณ„์‚ฐ์„ ์œ„ํ•œ ์•ต์ปค
10+
11+
while n > 0: # n์ด 0์ด ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋Œ๋ฆฐ๋‹ค.
12+
remainder = n % 2 # ์ˆ˜๋ฅผ 2๋กœ ๋‚˜๋ˆด์„ ๋•Œ์˜ ๋‚˜๋จธ์ง€๊ฐ€ ํ•ด๋‹น ์ž๋ฆฌ์ˆ˜์—์„œ์˜ 2์ง„์ˆ˜ ๊ฐ’ (0 or 1)
13+
quotient = n // 2 # ๋ชซ์€ ๋‹ค์Œ ๋ฃจํ”„์˜ ํ”ผ์ ฏ์ˆ˜๋กœ
14+
15+
if remainder:
16+
# ๋‚˜๋จธ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น 2์ง„์ˆ˜ ์ž๋ฆฌ์ˆ˜์— ๊ฐ’์ด ์žˆ๋‹ค.
17+
# reversedํ•œ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 32 - idx - 1์˜ ์ž๋ฆฟ์ˆ˜๋กœ ๋ณ€ํ™˜
18+
# (๋ฌธ์ œ ์กฐ๊ฑด ์ƒ 32์ž๋ฆฟ์ˆ˜๊ฐ€ ๊ธฐ์ค€)
19+
# ๋ณ€ํ™˜ํ•œ ํ›„ result์— ๊ฐ’์„ ๋”ํ•ด์ค€๋‹ค.
20+
result += 2 ** (32 - idx - 1)
21+
22+
n = quotient
23+
idx += 1 # ์ž๋ฆฟ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์˜ฌ๋ฆฐ๋‹ค
24+
25+
return result
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# 7๊ธฐ ํ’€์ด
2+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(m * n)
3+
# - matrix ํฌ๊ธฐ ๋งŒํผ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋“ฆ
4+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(m + n)
5+
# - ๊ฐ€๋กœ, ์„ธ๋กœ์—์„œ ๊ฐ๊ฐ ๋Œ€์ƒ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅ
6+
class Solution:
7+
def setZeroes(self, matrix: List[List[int]]) -> None:
8+
"""
9+
Do not return anything, modify matrix in-place instead.
10+
"""
11+
len_i = len(matrix)
12+
len_j = len(matrix[0])
13+
14+
# 0์ด ๋ฐœ๊ฒฌ๋œ ํ–‰/์—ด ์ธ๋ฑ์Šค๋ฅผ ๊ฐ๊ฐ ์ €์žฅํ•˜๋Š” set
15+
target_i_set, target_j_set = set(), set()
16+
17+
for i in range(len_i):
18+
for j in range(len_j):
19+
if matrix[i][j] != 0:
20+
continue
21+
22+
# matrix[i][j]๊ฐ€ 0์ธ ๊ฒฝ์šฐ์—๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•œ๋‹ค.
23+
target_i_set.add(i)
24+
target_j_set.add(j)
25+
26+
27+
for i in range(len_i):
28+
for j in range(len_j):
29+
if matrix[i][j] == 0:
30+
continue
31+
if i in target_i_set or j in target_j_set:
32+
# i, j ์ธ๋ฑ์Šค๊ฐ€ set์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” 0์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
33+
matrix[i][j] = 0

0 commit comments

Comments
ย (0)