Skip to content

Commit 76098e6

Browse files
authored
Merge pull request #1518 from seungriyou/main
[seungriyou] Week 09 Solutions
2 parents 8b828a2 + 9a12938 commit 76098e6

File tree

5 files changed

+347
-0
lines changed

5 files changed

+347
-0
lines changed

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

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# https://leetcode.com/problems/linked-list-cycle/
2+
3+
from typing import Optional
4+
5+
# Definition for singly-linked list.
6+
class ListNode:
7+
def __init__(self, x):
8+
self.val = x
9+
self.next = None
10+
11+
class Solution:
12+
def hasCycle_on(self, head: Optional[ListNode]) -> bool:
13+
"""
14+
[Complexity]
15+
- TC: O(n)
16+
- SC: O(n)
17+
18+
[Approach]
19+
hash table๋กœ visited ๋…ธ๋“œ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
20+
"""
21+
curr = head
22+
visited = set()
23+
24+
while curr:
25+
if curr in visited:
26+
return True
27+
28+
visited.add(curr)
29+
curr = curr.next
30+
31+
return False
32+
33+
def hasCycle(self, head: Optional[ListNode]) -> bool:
34+
"""
35+
[Complexity]
36+
- TC: O(n)
37+
- SC: O(1)
38+
39+
[Approach]
40+
Floydโ€™s Cycle Detection ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
41+
linked list์—์„œ slow (1์นธ์”ฉ ์ „์ง„) & fast (2์นธ์”ฉ ์ „์ง„) runner๋ฅผ ์ด์šฉํ•˜๋ฉด,
42+
- slow์™€ fast๊ฐ€ ๋งŒ๋‚œ๋‹ค๋ฉด cyclic
43+
- ๋งŒ๋‚˜์ง€ ์•Š์€ ์ฑ„๋กœ fast๊ฐ€ ๋์— ๋„๋‹ฌํ•˜๋ฉด not cyclic
44+
์ด๋‹ค.
45+
"""
46+
slow = fast = head
47+
48+
while fast and fast.next:
49+
slow = slow.next
50+
fast = fast.next.next
51+
52+
if slow == fast:
53+
return True
54+
55+
return False
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# https://leetcode.com/problems/maximum-product-subarray/
2+
3+
from typing import List
4+
5+
class Solution:
6+
def maxProduct(self, nums: List[int]) -> int:
7+
"""
8+
[Complexity]
9+
- TC: O(n)
10+
- SC: O(1)
11+
12+
[Approach]
13+
nums๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ๊ฐ’ num์ด ํฌํ•จ๋˜๋Š” max subarray product๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”
14+
max(์ด์ „ ๊ฐ’๊ณผ ์—ฐ์†๋˜๋Š” subarray์ธ ๊ฒฝ์šฐ, ์ด์ „ ๊ฐ’๊ณผ ์—ฐ์†๋˜์ง€ ์•Š๋Š” subarray์ธ ๊ฒฝ์šฐ)๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.
15+
- num์ด ์–‘์ˆ˜์ผ ๋•Œ: max(์ด์ „๊นŒ์ง€์˜ max subarray product * num, num)
16+
- num์ด ์Œ์ˆ˜์ผ ๋•Œ: max(์ด์ „๊นŒ์ง€์˜ min subarray product * num, num)
17+
๋”ฐ๋ผ์„œ ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ์ด์ „๊นŒ์ง€์˜ max subarray product(= max_p)์™€ min subarray product(= min_p)๋ฅผ ํŠธ๋ž˜ํ‚นํ•ด์•ผ ํ•œ๋‹ค.
18+
"""
19+
res = max_p = min_p = nums[0]
20+
21+
for i in range(1, len(nums)):
22+
num = nums[i]
23+
24+
# 1. num์ด ์Œ์ˆ˜๋ผ๋ฉด, max_p์™€ min_p ๋ฐ”๊ฟ”์น˜๊ธฐ
25+
# if num < 0:
26+
# max_p, min_p = min_p, max_p
27+
28+
# 2. max_p, min_p ์—…๋ฐ์ดํŠธ
29+
# max_p = max(max_p * num, num)
30+
# min_p = min(min_p * num, num)
31+
32+
# 1 & 2๋ฒˆ ๋Œ€์‹ , ๋‹ค์ค‘ ํ• ๋‹น์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
33+
max_p, min_p = max(max_p * num, min_p * num, num), min(max_p * num, min_p * num, num)
34+
35+
# 3. res ๊ฐ’ ์—…๋ฐ์ดํŠธ
36+
res = max(res, max_p)
37+
38+
return res
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# https://leetcode.com/problems/minimum-window-substring/
2+
3+
class Solution:
4+
def minWindow1(self, s: str, t: str) -> str:
5+
"""
6+
[Complexity]
7+
- TC: O(m * k + n) (k = is_included() = len(set(t)))
8+
- SC: O(k) (res ์ œ์™ธ)
9+
10+
[Approach]
11+
๋‹ค์Œ๊ณผ ๊ฐ™์€ counter๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, two pointer๋กœ window๋ฅผ ์ด๋™ํ•˜๋ฉฐ min window substring์„ ํŠธ๋ž˜ํ‚นํ•œ๋‹ค.
12+
- ์ƒ์„ฑ ์‹œ) t์˜ ๋ชจ๋“  ๋ฌธ์ž์— ๋Œ€ํ•ด ++
13+
- pointer ์ด๋™ ์‹œ) window์— ํฌํ•จ๋˜๋Š” ๋ฌธ์ž ์ค‘ t์— ์†ํ•˜๋Š” ๋ฌธ์ž์— ๋Œ€ํ•ด --
14+
"""
15+
from collections import Counter
16+
17+
# early stop
18+
m, n = len(s), len(t)
19+
if m < n:
20+
return ""
21+
22+
# t์— ๋Œ€ํ•œ counter ์ƒ์„ฑ
23+
counter = Counter(t)
24+
25+
# t์˜ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ window์— ํฌํ•จ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
26+
def is_included():
27+
# counter์˜ ๋ชจ๋“  ๊ฐ’์ด 0 ์ดํ•˜์ด๋ฉด, t์˜ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ window์— ํฌํ•จ๋˜๋Š” ๊ฒƒ (์ค‘๋ณต ํฌํ•จ)
28+
return all(c <= 0 for c in counter.values())
29+
30+
lo, min_len = 0, 1e6
31+
res = ""
32+
33+
for hi in range(m):
34+
# ํ˜„์žฌ window์— ํฌํ•จ๋œ ๋ฌธ์ž๋ฅผ counter์— ๋ฐ˜์˜
35+
if s[hi] in counter:
36+
counter[s[hi]] -= 1
37+
38+
# t์˜ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ window์— ํฌํ•จ๋˜์–ด์žˆ๋‹ค๋ฉด(= counter์˜ ๋ชจ๋“  ๊ฐ’์ด <= 0์ด๋ฉด),
39+
# counter ๊ฐ’์ด ์Œ์ˆ˜ ~ 0์ด ๋  ๋•Œ๊นŒ์ง€ lo ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ (min window๋ฅผ ๊ตฌํ•ด์•ผํ•˜๋ฏ€๋กœ) counter ์—…๋ฐ์ดํŠธ
40+
if is_included():
41+
while True:
42+
# window์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ t์— ์†ํ•˜๋Š” ๋ฌธ์ž๋ผ๋ฉด
43+
if s[lo] in counter:
44+
# counter์—์„œ์˜ ๊ฐ’์ด 0์ด๋ฉด, ๋”์ด์ƒ lo๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์—†์Œ
45+
if counter[s[lo]] == 0:
46+
break
47+
# coutner์—์„œ์˜ ๊ฐ’์ด ์Œ์ˆ˜๋ผ๋ฉด, lo๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ counter ๋ฐ˜์˜
48+
else:
49+
counter[s[lo]] += 1
50+
# lo๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™
51+
lo += 1
52+
53+
# (1) t์˜ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ window์— ํฌํ•จ๋˜์–ด ์žˆ๊ณ  (2) ํ˜„์žฌ window์˜ length๊ฐ€ min_len ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด
54+
# window substring ์—…๋ฐ์ดํŠธ
55+
if is_included() and (new_len := hi - lo + 1) < min_len:
56+
min_len = new_len
57+
res = s[lo:hi + 1]
58+
59+
return res
60+
61+
def minWindow(self, s: str, t: str) -> str:
62+
"""
63+
[Complexity]
64+
- TC: O(m + n)
65+
- SC: O(k)
66+
67+
[Approach]
68+
1) ์œ„์˜ ํ’€์ด์—์„œ is_included()๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ์— O(k)์ด ์†Œ์š”๋˜๋ฏ€๋กœ,
69+
(t์— ์†ํ•˜๋Š” ๋ฌธ์ž ์ค‘, ์•„์ง window์— ๋ชจ๋‘ ํฌํ•จ๋˜์ง€ ์•Š์€ ๋ฌธ์ž ์ข…๋ฅ˜ ๊ฐœ์ˆ˜)๋ฅผ ํŠธ๋ž˜ํ‚นํ•˜๋Š” ๋ณ€์ˆ˜ remains๋ฅผ ์ด์šฉํ•˜์—ฌ ์ตœ์ ํ™” ํ•œ๋‹ค.
70+
์ฆ‰, remains == 0์ด๋ผ๋ฉด is_included()์ธ ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.
71+
2) ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์‹ฑ์œผ๋กœ res๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ ์ถ”๊ฐ€์ ์ธ ๋ณต์žก๋„๊ฐ€ ์†Œ์š”๋œ๋‹ค.
72+
๋”ฐ๋ผ์„œ min window์— ๋Œ€ํ•œ pointer์ธ min_lo, min_hi๋งŒ ํŠธ๋ž˜ํ‚นํ•˜๊ณ , return ๋ฌธ์—์„œ ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์‹ฑ์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
73+
๋‹จ, min window substring์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, min_lo ~ min_hi - 1 ๋ฒ”์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ๋‹ค.
74+
"""
75+
from collections import Counter
76+
77+
# early stop
78+
m, n = len(s), len(t)
79+
if m < n:
80+
return ""
81+
82+
# t์— ๋Œ€ํ•œ counter ์ƒ์„ฑ
83+
counter = Counter(t)
84+
85+
# counter์˜ ๊ฐ’์„ ๋ชจ๋‘ ํ™•์ธํ•˜๋Š” is_include() ์ตœ์ ํ™”
86+
remains = len(counter) # t์— ์†ํ•˜๋Š” ๋ฌธ์ž ์ค‘, ์•„์ง window์— ๋ชจ๋‘ ํฌํ•จ๋˜์ง€ ์•Š์€ ๋ฌธ์ž ์ข…๋ฅ˜ ๊ฐœ์ˆ˜
87+
lo = min_lo = min_hi = 0
88+
min_len = m + 1
89+
90+
for hi in range(m):
91+
# ํ˜„์žฌ window์— ํฌํ•จ๋œ ๋ฌธ์ž๋ฅผ counter์— ๋ฐ˜์˜
92+
if s[hi] in counter:
93+
counter[s[hi]] -= 1
94+
# ํ˜„์žฌ window์— ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ t์— ์กด์žฌํ•˜๋Š” ๊ฐœ์ˆ˜๋งŒํผ ๋“ค์–ด์™€์žˆ๋‹ค๋ฉด, remains--
95+
if counter[s[hi]] == 0:
96+
remains -= 1
97+
98+
# t์˜ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ window์— ํฌํ•จ๋˜์–ด์žˆ๋Š” ๋™์•ˆ lo ์ด๋™
99+
while not remains:
100+
# ์ตœ์†Œ ๊ธธ์ด window substring ๊ฐฑ์‹ 
101+
if (new_len := hi - lo + 1) < min_len:
102+
min_len, min_lo, min_hi = new_len, lo, hi + 1
103+
104+
# lo ์ด๋™ ์ „, counter ์—…๋ฐ์ดํŠธ
105+
if s[lo] in counter:
106+
counter[s[lo]] += 1
107+
# counter์˜ ๊ฐ’์ด 0 ์ดˆ๊ณผ๊ฐ€ ๋œ๋‹ค๋ฉด, ๋”์ด์ƒ window์— ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ remains++
108+
if counter[s[lo]] > 0:
109+
remains += 1
110+
111+
# lo๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™
112+
lo += 1
113+
114+
return s[min_lo:min_hi]
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# https://leetcode.com/problems/pacific-atlantic-water-flow/
2+
3+
from typing import List
4+
5+
class Solution:
6+
def pacificAtlantic_bfs(self, heights: List[List[int]]) -> List[List[int]]:
7+
"""
8+
[Complexity]
9+
- TC: O(m * n) (๋ชจ๋“  ์นธ์€ ์ตœ๋Œ€ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธ)
10+
- SC: O(m * n) (queue)
11+
12+
[Approach]
13+
๊ฑฐ๊พธ๋กœ ๊ฐ ๋ฐ”๋‹ค์— ๋งž๋‹ฟ์•„์žˆ๋Š” edges์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ, BFS๋กœ height ๊ฐ’์ด gte์ธ ์นธ(-> ๋ฐ”๋‹ค์—์„œ๋ถ€ํ„ฐ ๊ฑฐ๊พธ๋กœ ํ™•์ธํ•˜๋ฏ€๋กœ)์„ ๋ฐฉ๋ฌธํ•˜๋ฉฐ ๊ธฐ๋กํ•œ๋‹ค.
14+
pacific & atlantic ์ชฝ edges์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋ฐฉ๋ฌธํ•œ ์นธ๋“ค์˜ ๊ต์ง‘ํ•ฉ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.
15+
"""
16+
from collections import deque
17+
18+
m, n = len(heights), len(heights[0])
19+
dr, dc = [-1, 1, 0, 0], [0, 0, -1, 1]
20+
21+
def bfs(start_cells):
22+
q = deque(start_cells)
23+
visited = set(start_cells)
24+
25+
while q:
26+
r, c = q.popleft()
27+
28+
for i in range(4):
29+
nr, nc = r + dr[i], c + dc[i]
30+
31+
if (
32+
0 <= nr < m and 0 <= nc < n # validํ•œ ๋ฒ”์œ„ ํ™•์ธ
33+
and (nr, nc) not in visited # ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธ
34+
and heights[nr][nc] >= heights[r][c] # height ๊ฐ’์ด ํ˜„์žฌ ์นธ๋ณด๋‹ค gte์ธ์ง€ ํ™•์ธ (** ๊ฑฐ๊พธ๋กœ ํ™•์ธํ•˜๋ฏ€๋กœ)
35+
):
36+
q.append((nr, nc))
37+
visited.add((nr, nc))
38+
39+
return visited
40+
41+
# pacific & atlantic ์ชฝ edges ๋ชจ์œผ๊ธฐ
42+
edges_p, edges_a = [], []
43+
for r in range(m):
44+
edges_p.append((r, 0))
45+
edges_a.append((r, n - 1))
46+
for c in range(n):
47+
edges_p.append((0, c))
48+
edges_a.append((m - 1, c))
49+
50+
# edges๋กœ๋ถ€ํ„ฐ BFS๋กœ ๋ฐฉ๋ฌธ
51+
visited_p = bfs(edges_p)
52+
visited_a = bfs(edges_a)
53+
54+
# pacific๊ณผ atlantic์˜ ๊ต์ง‘ํ•ฉ ๋ฐ˜ํ™˜
55+
return [list(cell) for cell in visited_p & visited_a]
56+
57+
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
58+
"""
59+
[Complexity]
60+
- TC: O(m * n) (๋ชจ๋“  ์นธ์€ ์ตœ๋Œ€ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธ)
61+
- SC: O(m * n) (call stack)
62+
63+
[Approach]
64+
BFS ํ’€์ด๋ฅผ DFS๋กœ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
65+
"""
66+
m, n = len(heights), len(heights[0])
67+
dr, dc = [-1, 1, 0, 0], [0, 0, -1, 1]
68+
visited_p, visited_a = set(), set()
69+
70+
def dfs(r, c, visited):
71+
# base condition
72+
if (r, c) in visited: # ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธ
73+
return
74+
75+
# ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
76+
visited.add((r, c))
77+
78+
# recur
79+
for i in range(4):
80+
nr, nc = r + dr[i], c + dc[i]
81+
82+
if (
83+
0 <= nr < m and 0 <= nc < n # validํ•œ ๋ฒ”์œ„ ํ™•์ธ
84+
and heights[nr][nc] >= heights[r][c] # height ๊ฐ’์ด ํ˜„์žฌ ์นธ๋ณด๋‹ค gte์ธ์ง€ ํ™•์ธ (** ๊ฑฐ๊พธ๋กœ ํ™•์ธํ•˜๋ฏ€๋กœ)
85+
):
86+
dfs(nr, nc, visited)
87+
88+
# edges๋กœ๋ถ€ํ„ฐ DFS๋กœ ๋ฐฉ๋ฌธ
89+
for r in range(m):
90+
dfs(r, 0, visited_p)
91+
dfs(r, n - 1, visited_a)
92+
for c in range(n):
93+
dfs(0, c, visited_p)
94+
dfs(m - 1, c, visited_a)
95+
96+
# pacific๊ณผ atlantic์˜ ๊ต์ง‘ํ•ฉ ๋ฐ˜ํ™˜
97+
return [list(cell) for cell in visited_p & visited_a]

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# https://leetcode.com/problems/sum-of-two-integers/
2+
3+
class Solution:
4+
def getSum(self, a: int, b: int) -> int:
5+
"""
6+
[Complexity]
7+
- TC: O(1)
8+
- SC: O(1)
9+
10+
[Approach]
11+
๋ง์…ˆ ๊ตฌํ˜„ ์‹œ ์ฃผ์š”ํ•œ ์š”์†Œ๋Š” carry์™€ value ๊ฐ’์ด๋‹ค.
12+
์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ง„์ˆ˜ 11๊ณผ 101์˜ ๋ง์…ˆ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๊ฐ ์ž๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” carry์™€ value๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
13+
a = 0 1 1
14+
b = 1 0 1
15+
---------------
16+
value) 1 1 0 (= a ^ b)
17+
carry) 0 0 1 (= a & b)
18+
์ด๋•Œ, ์–ด๋–ค ์ž๋ฆฌ์—์„œ ๋ฐœ์ƒํ•œ carry๋Š” ํ•œ ์นธ left shift ๋˜์–ด ๋‹ค์‹œ ๋ง์…ˆ์„ ์ˆ˜ํ–‰ํ•˜๋“ฏ ์ ์šฉ๋˜์–ด์•ผ ํ•จ์— ์ฃผ์˜ํ•œ๋‹ค.
19+
value) 1 1 0
20+
carry) 0 0 1 0 (<<= 1)
21+
22+
์ด ๊ณผ์ •์„ carry๊ฐ€ 0์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด๋‚˜๊ฐ„๋‹ค.
23+
value) 0 1 0 0 (= a ^ b)
24+
carry) 0 1 0 0 (= (a & b) << 1)
25+
26+
value) 0 0 0 0 (= a ^ b)
27+
carry) 1 0 0 0 (= (a & b) << 1)
28+
29+
value) 1 0 0 0 (= a ^ b) -> RESULT
30+
carry) 0 0 0 0 (= (a & b) << 1) -> END
31+
32+
ํ•˜์ง€๋งŒ ํŒŒ์ด์ฌ์—์„œ๋Š” int๋ฅผ 32bit ๋ณด๋‹ค ํฐ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋ฏ€๋กœ ์Œ์ˆ˜๊ฐ€ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•ด ๋‹ค์Œ์˜ ์ž‘์—…์„ ์ถ”๊ฐ€๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
33+
- ์Œ์ˆ˜๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋ฉด carry๊ฐ€ 32bit๋ฅผ ๋„˜์–ด์„œ๋„ ๊ณ„์† ๋”ํ•ด์งˆ ๊ฒƒ์ด๋ฏ€๋กœ, while ๋ฌธ ์กฐ๊ฑด์‹์—์˜ carry์— 32bit masking์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
34+
- (b & mask) == 0์ด์ง€๋งŒ b > 0์ธ ๊ฒฝ์šฐ์—๋Š” a์˜ 32bit ๋ฒ”์œ„ ๋ฐ–์— overflow๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, ๊ฒฐ๊ณผ ๊ฐ’์—๋„ 32bit masking์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
35+
"""
36+
37+
mask = 0xffffffff # 32bit masking
38+
39+
# carry๊ฐ€ 0์ด ๋  ๋–„๊นŒ์ง€ ๋ฐ˜๋ณต (์Œ์ˆ˜๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ, 32bit masking ํ›„ ํ™•์ธ)
40+
while (b & mask) != 0:
41+
a, b = a ^ b, (a & b) << 1 # value, carry
42+
43+
return (a & mask) if b > 0 else a # ์Œ์ˆ˜ (overflow) ์ฒ˜๋ฆฌ

0 commit comments

Comments
ย (0)