Skip to content

Commit dde8a7e

Browse files
authored
Merge pull request #1523 from KwonNayeon/main
[KwonNayeon] Week 9 Solutions
2 parents 9fe16f7 + ec1a55a commit dde8a7e

File tree

5 files changed

+106
-51
lines changed

5 files changed

+106
-51
lines changed

โ€Žlinked-list-cycle/KwonNayeon.py

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,24 @@
44
- -10^5 <= Node.val <= 10^5
55
- pos is -1 or a valid index in the linked-list
66
7-
Time Complexity:
8-
- Solution 1: O(n)
9-
- Solution 2: O(n)
10-
11-
Space Complexity:
12-
- Solution 1: O(n) - visited set์— ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ
13-
- Solution 2: O(1) - ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
14-
15-
ํ’€์ด๋ฐฉ๋ฒ•:
16-
1. ์ฒ˜์Œ์—” ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ, ํ•œ ๋ฒˆ ๋งˆ์ฃผ์นœ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ๋งŒ๋‚˜๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ฐฉ์‹
17-
2. slow, fast ๋‘ ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ํ™œ์šฉ, ๋งŒ์•ฝ cycle์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ fast๊ฐ€ slow์™€ ์–ธ์  ๊ฐ€ ๋งŒ๋‚˜๊ฒŒ ๋จ,
18-
๋งŒ์•ฝ cycle์ด ์—†๋‹ค๋ฉด ๋‘˜์€ ๋งŒ๋‚˜์ง€ ์•Š์Œ
19-
"""
207
8+
<Solution 1>
9+
10+
Time Complexity: O(n)
11+
- while ๋ฃจํ”„๋ฅผ ์ตœ๋Œ€ n๋ฒˆ ์‹คํ–‰ (๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋งŒํผ)
12+
13+
Space Complexity: O(n)
14+
- visited set์— ์ตœ๋Œ€ n๊ฐœ์˜ ๋…ธ๋“œ ์ €์žฅํ•จ
15+
- set() ์กฐํšŒ/์‚ฝ์ž…์— O(1)
16+
17+
ํ’€์ด ๋ฐฉ๋ฒ•:
18+
- ํ•œ ๋ฒˆ ๋งˆ์ฃผ์นœ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ๋งŒ๋‚˜๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ฐฉ์‹
19+
"""
2120
# Definition for singly-linked list.
2221
# class ListNode:
2322
# def __init__(self, x):
2423
# self.val = x
2524
# self.next = None
26-
27-
# Solution 1: ํ•œ ๋ฒˆ ๋งˆ์ฃผ์นœ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ๋งŒ๋‚˜๋Š”์ง€๋ฅผ ์ฒดํฌ
2825
class Solution:
2926
def hasCycle(self, head: Optional[ListNode]) -> bool:
3027
visited = set()
@@ -38,14 +35,26 @@ def hasCycle(self, head: Optional[ListNode]) -> bool:
3835

3936
return False
4037

41-
# Solution 2: ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ ์ด์šฉ
38+
"""
39+
<Solution 2>
40+
41+
Time Complexity: O(n)
42+
- while ๋ฃจํ”„๋ฅผ ์ตœ๋Œ€ n๋ฒˆ ์‹คํ–‰ (๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋งŒํผ)
43+
44+
Space Complexity: O(1)
45+
- ํˆฌ ํฌ์ธํ„ฐ ์ด์™ธ์˜ ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
46+
47+
ํ’€์ด ๋ฐฉ๋ฒ•:
48+
- ํˆฌ ํฌ์ธํ„ฐ ๋ฐฉ์‹ (slow, fast)
49+
- ๋งŒ์•ฝ cycle์ด ์žˆ๋‹ค๋ฉด, fast๊ฐ€ slow์™€ ์–ธ์  ๊ฐ€ ๋งŒ๋‚˜๊ฒŒ ๋จ
50+
- cycle์ด ์—†๋‹ค๋ฉด ๋‘˜์€ ๋งŒ๋‚˜์ง€ ์•Š์Œ
51+
"""
4252
class Solution:
4353
def hasCycle(self, head: Optional[ListNode]) -> bool:
4454
if not head:
4555
return False
4656

47-
slow = head
48-
fast = head
57+
slow = fast = head
4958

5059
while fast and fast.next:
5160
slow = slow.next
@@ -55,4 +64,3 @@ def hasCycle(self, head: Optional[ListNode]) -> bool:
5564
return True
5665

5766
return False
58-

โ€Žmaximum-product-subarray/KwonNayeon.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@
44
- -10 <= nums[i] <= 10
55
- The product of any subarray of nums is guaranteed to fit in a 32-bit integer.
66
7-
Time Complexity:
8-
- O(n): ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ์œ„์น˜์—์„œ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ์—ฐ์‚ฐ๋งŒ ์ˆ˜ํ–‰
7+
Time Complexity: O(n)
8+
- ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•˜๊ณ , ๊ฐ ์œ„์น˜์—์„œ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ์—ฐ์‚ฐ(max, min, ๊ณฑ์…ˆ)๋งŒ ์ˆ˜ํ–‰
99
10-
Space Complexity:
11-
- O(1): ๊ณ ์ •๋œ ์ถ”๊ฐ€ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ (curr_max, curr_min, ...)
10+
Space Complexity: O(1)
11+
- ์ž…๋ ฅ ํฌ๊ธฐ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณ ์ •๋œ ๋ณ€์ˆ˜(curr_max, curr_min, result, temp)๋งŒ ์‚ฌ์šฉ
1212
1313
ํ’€์ด๋ฐฉ๋ฒ•:
14-
1. DP๋กœ ๊ฐ ์œ„์น˜์—์„œ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€๊ณฑ๊ณผ ์ตœ์†Œ๊ณฑ์„ ๋™์‹œ์— ์ถ”์ ํ•จ
15-
2. ๊ฐ ์œ„์น˜์—์„œ ์„ธ ๊ฐœ์˜ ์„ ํƒ์ง€ ์กด์žฌ: ์ƒˆ๋กœ ์‹œ์ž‘ vs ์ด์ „ ์ตœ๋Œ€๊ณฑ๊ณผ ๊ณฑํ•˜๊ธฐ vs ์ด์ „ ์ตœ์†Œ๊ณฑ๊ณผ ๊ณฑํ•˜๊ธฐ
16-
3. ์ตœ์†Œ๊ณฑ์ด ํ•„์š”ํ•œ ์ด์œ : ๋‚˜์ค‘์— ์Œ์ˆ˜๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ์ตœ๋Œ€๊ฐ’์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ
14+
1. DP๋กœ ๊ฐ ์œ„์น˜์—์„œ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’์„ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธํ•จ
15+
2. ๊ฐ ์œ„์น˜์—์„œ ์„ธ ๊ฐœ์˜ ์„ ํƒ์ง€ ์กด์žฌ: ์ƒˆ๋กœ ์‹œ์ž‘ vs ์ด์ „ ์ตœ๋Œ€๊ฐ’๊ณผ ๊ณฑํ•˜๊ธฐ vs ์ด์ „ ์ตœ์†Œ๊ฐ’๊ณผ ๊ณฑํ•˜๊ธฐ
16+
3. ์ตœ์†Œ๊ฐ’์„ ๊ณ„์† ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์ด์œ : ์Œ์ˆ˜*์Œ์ˆ˜ = ์ƒˆ๋กœ์šด ์ตœ๋Œ€๊ฐ’, curr_max ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์“ฐ์ž„ (์˜ˆ์‹œ: nums = [2, 3, -2, 4, -1])
1717
4. ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค result ์—…๋ฐ์ดํŠธ
1818
1919
๊ณ ๋ ค์‚ฌํ•ญ:
20-
1. ๊ฐ’์ด 0์ธ ๊ฒฝ์šฐ โ†’ ์ƒˆ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ
21-
2. temp ๋ณ€์ˆ˜: curr_max๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด curr_min ๊ณ„์‚ฐ ์‹œ ์›๋ž˜ ๊ฐ’์ด ํ•„์š”ํ•จ
20+
1. ๊ฐ’์ด 0์ธ ๊ฒฝ์šฐ ์ƒˆ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ
21+
2. temp ๋ณ€์ˆ˜: curr_min ๊ณ„์‚ฐ ์‹œ curr_max๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์˜ ๊ฐ’์ด ํ•„์š”ํ•จ
2222
"""
2323
class Solution:
2424
def maxProduct(self, nums: List[int]) -> int:
@@ -33,5 +33,3 @@ def maxProduct(self, nums: List[int]) -> int:
3333
result = max(result, curr_max)
3434

3535
return result
36-
37-

โ€Žminimum-window-substring/KwonNayeon.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,13 @@
2323
3. ์ตœ์†Œ ๊ธธ์ด์˜ ์œˆ๋„์šฐ ๋ฐ˜ํ™˜
2424
2525
๋ฉ”๋ชจ:
26-
- ํ’€์ด ๋ฐฉ๋ฒ•์„ ๋ณด๊ณ  ์ตํž˜
27-
- ํ•ด์‹œ๋งต๊ณผ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๊ด€๋ จ ๋‹ค๋ฅธ ๋ฌธ์ œ๋“ค์„ ํ’€๊ณ  ์ด ๋ฌธ์ œ ์Šค์Šค๋กœ ํ’€์–ด๋ณด๊ธฐ
26+
- ๊ด€๋ จ ๋ฌธ์ œ:
27+
- Two Sum (๋”•์…”๋„ˆ๋ฆฌ)
28+
- Ransom Note (Counter)
29+
- Longest Substring Without Repeating (์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ)
30+
- Permutation in String (์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ + Counter)
31+
- Find All Anagrams in a String (์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ + Counter)
32+
- 4, 5๋ฒˆ ๋ฌธ์ œ ๋จผ์ € ํ’€์–ด๋ณด๊ธฐ
2833
"""
2934
class Solution:
3035
def minWindow(self, s: str, t: str) -> str:
@@ -46,4 +51,3 @@ def minWindow(self, s: str, t: str) -> str:
4651
low += 1
4752

4853
return s[min_low : min_high + 1] if min_high < len(s) else ""
49-

โ€Žpacific-atlantic-water-flow/KwonNayeon.py

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,19 @@
66
- 0 <= heights[r][c] <= 10^5
77
88
Time Complexity: O(m*n)
9-
- ๊ฐ ์…€์„ ์ตœ๋Œ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธํ•จ
9+
- ๊ฐ ์…€์„ ์ตœ๋Œ€ ํ•œ ๋ฒˆ๋งŒ ๋ฐฉ๋ฌธํ•จ
1010
1111
Space Complexity: O(m*n)
12-
- visited sets(pacific, atlantic)๊ฐ€ ์ตœ๋Œ€ m*n ํฌ๊ธฐ
13-
- ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ๋„ ์ตœ๋Œ€ m*n ๊นŠ์ด ๊ฐ€๋Šฅ
12+
- visited sets(pacific, atlantic)์€ ์ตœ๋Œ€ m*n ํฌ๊ธฐ
13+
- ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ๋„ ์ตœ๋Œ€ m*n๊นŒ์ง€ ๊ฐ€๋Šฅ
1414
1515
ํ’€์ด๋ฐฉ๋ฒ•:
16-
1. Pacific(์ขŒ์ธก์ƒ๋‹จ)๊ณผ Atlantic(์šฐ์ธกํ•˜๋‹จ)์˜ ๊ฒฝ๊ณ„์—์„œ ์‹œ์ž‘ํ•จ
17-
2. DFS๋กœ ํ˜„์žฌ ๋†’์ด๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ ๊ฐ™์€ ์ธ์ ‘ ์…€๋กœ๋งŒ ์ด๋™ํ•จ (๋ฌผ์€ ์œ„ -> ์•„๋ž˜๋กœ ํ๋ฅด์ง€๋งŒ, ๊ฑฐ๊พธ๋กœ ์ ‘๊ทผํ–ˆ์œผ๋‹ˆ๊นŒ)
16+
1. Pacific(์ขŒ์ธก์ƒ๋‹จ)๊ณผ Atlantic(์šฐ์ธกํ•˜๋‹จ)์˜ ๊ฒฝ๊ณ„์—์„œ ์‹œ์ž‘
17+
2. DFS๋กœ ํ˜„์žฌ ๋†’์ด๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ ๊ฐ™์€ ์ธ์ ‘ ์…€๋กœ๋งŒ ์ด๋™ (์—ญ๋ฐฉํ–ฅ ์ ‘๊ทผ)
1818
3. ๊ฐ ๋ฐ”๋‹ค์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์…€๋“ค์„ Set์— ์ €์žฅ
19-
4. ๋‘ Set์˜ ๊ต์ง‘ํ•ฉ์ด ์ •๋‹ต (์–‘์ชฝ ๋ฐ”๋‹ค๋กœ ๋ชจ๋‘ ํ๋ฅผ ์ˆ˜ ์žˆ๋Š” ์ง€์ ๋“ค)
19+
4. ๋‘ Set์˜ ๊ต์ง‘ํ•ฉ์œผ๋กœ ์–‘์ชฝ ๋ฐ”๋‹ค ๋ชจ๋‘ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ง€์  ๋ฐ˜ํ™˜
2020
"""
21+
# ์›๋ณธ ์ฝ”๋“œ
2122
class Solution:
2223
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
2324
if not heights:
@@ -51,3 +52,43 @@ def dfs(r, c, visited):
5152
dfs(r, cols-1, atlantic)
5253

5354
return list(pacific & atlantic)
55+
56+
# ๊ฐœ์„ ๋œ ์ฝ”๋“œ
57+
class Solution:
58+
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
59+
rows, cols = len(heights), len(heights[0])
60+
61+
# ๊ฐ ๋ฐ”๋‹ค์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์œ„์น˜ ์ €์žฅ
62+
pacific = set()
63+
atlantic = set()
64+
65+
def dfs(r, c, visited):
66+
# ํ˜„์žฌ ์œ„์น˜ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
67+
visited.add((r, c))
68+
69+
# ๋„ค ๋ฐฉํ–ฅ ํƒ์ƒ‰ (์˜ค๋ฅธ์ชฝ, ์œ„, ์™ผ์ชฝ, ์•„๋ž˜)
70+
for dr, dc in [(0, 1), (-1, 0), (0, -1), (1, 0)]:
71+
new_r, new_c = r + dr, c + dc
72+
73+
# ๊ฒฝ๊ณ„ ์ฒดํฌ, ๋ฐฉ๋ฌธx ์ฒดํฌ, ๋†’์ด ์ฒดํฌ
74+
if (0 <= new_r < rows and
75+
0 <= new_c < cols and
76+
(new_r, new_c) not in visited and
77+
heights[new_r][new_c] >= heights[r][c]):
78+
79+
dfs(new_r, new_c, visited)
80+
81+
# Pacific ๊ฒฝ๊ณ„์—์„œ ์‹œ์ž‘ (์œ„ + ์™ผ์ชฝ)
82+
for c in range(cols):
83+
dfs(0, c, pacific)
84+
for r in range(rows):
85+
dfs(r, 0, pacific)
86+
87+
# Atlantic ๊ฒฝ๊ณ„์—์„œ ์‹œ์ž‘ (์•„๋ž˜ + ์˜ค๋ฅธ์ชฝ)
88+
for c in range(cols):
89+
dfs(rows-1, c, atlantic)
90+
for r in range(rows):
91+
dfs(r, cols-1, atlantic)
92+
93+
# ์–‘์ชฝ ๋ฐ”๋‹ค ๋ชจ๋‘ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์œ„์น˜ ๋ฐ˜ํ™˜
94+
return [[r, c] for r, c in pacific & atlantic]

โ€Žsum-of-two-integers/KwonNayeon.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
- -1000 <= a, b <= 1000
44
55
Time Complexity: O(1)
6+
- ๋น„ํŠธ ์ž๋ฆฌ์ˆ˜, while loop ๋ฐ˜๋ณต ํšŸ์ˆ˜๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์Œ
67
78
Space Complexity: O(1)
89
- ์ถ”๊ฐ€ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž…๋ ฅ๋ฐ›์€ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ
@@ -11,25 +12,28 @@
1112
1. XOR(^)์—ฐ์‚ฐ์„ ํ†ตํ•ด ์บ๋ฆฌ๋ฅผ ์ œ์™ธํ•œ ๊ฐ ์ž๋ฆฌ์˜ ํ•ฉ์„ ๊ตฌํ•จ
1213
2. AND(&)์—ฐ์‚ฐ ํ›„ ์™ผ์ชฝ ์‹œํ”„ํŠธ(<<)๋กœ ๋‹ค์Œ ์ž๋ฆฌ๋กœ ์˜ฌ๋ผ๊ฐˆ ์บ๋ฆฌ๋ฅผ ๊ตฌํ•จ
1314
3. ์บ๋ฆฌ๊ฐ€ 0์ด ๋  ๋•Œ๊นŒ์ง€ 1-2 ๊ณผ์ •์„ ๋ฐ˜๋ณต
15+
- ์บ๋ฆฌ๋Š” ์œ ํ•œํ•œ ๋น„ํŠธ ๋ฒ”์œ„์—์„œ๋งŒ ์กด์žฌํ•จ
16+
- ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ณ„์† ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋‹ค ๊ฒฐ๊ตญ ์‚ฌ๋ผ์ง
17+
- ์บ๋ฆฌ๊ฐ€ 0์ด ๋˜๋ฉด ๋ฃจํ”„ ์ข…๋ฃŒ
1418
"""
15-
# Solution 1: ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฒ„์ „
19+
# Solution 1
1620
class Solution:
1721
def getSum(self, a: int, b: int) -> int:
1822
while b:
19-
current_sum = a ^ b
20-
21-
next_carry = (a & b) << 1
22-
23-
a = current_sum
24-
b = next_carry
23+
a, b = a ^ b, (a & b) << 1
2524

2625
return a
27-
28-
# Solution 2: ์ตœ์ ํ™” ๋ฒ„์ „
26+
27+
# Solution 2: ์Œ์ˆ˜ ์ผ€์ด์Šค ์ฒ˜๋ฆฌ
2928
class Solution:
3029
def getSum(self, a: int, b: int) -> int:
31-
while b:
32-
a, b = a ^ b, (a & b) << 1
30+
mask = 0xffffffff # 32๋น„ํŠธ ๋งˆ์Šคํ‚น
3331

34-
return a
32+
while b & mask:
33+
# ์บ๋ฆฌ ์—†๋Š” ๋ง์…ˆ + 32๋น„ํŠธ ์ œํ•œ, ์บ๋ฆฌ ๊ณ„์‚ฐ + 32๋น„ํŠธ ์ œํ•œ
34+
a, b = (a ^ b) & mask, ((a & b) << 1) & mask
35+
36+
# a <= 0x7FFFFFFF: ์–‘์ˆ˜์ผ ๋•Œ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜(0x7FFFFFFF = 32๋น„ํŠธ ์ตœ๋Œ€ ์–‘์ˆ˜)
37+
# a > 0x7FFFFFFF: ์Œ์ˆ˜์ผ ๋•Œ Python ์Œ์ˆ˜๋กœ ๋ณ€ํ™˜
38+
return a if a <= 0x7FFFFFFF else a | (~mask)
3539

0 commit comments

Comments
ย (0)