[alphaorderly] WEEK 09 Solutions - #2822
Conversation
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
linked-list-cycle/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(n)
๊ณต๊ฐ๋ณต์ก๋: O(1)
1. ํ ๋ผ์ ๊ฑฐ๋ถ์ด๋ฅผ ์ด๊ธฐํํ๋ค.
- ํ ๋ผ : ๋ ์นธ์ฉ ์ด๋
- ๊ฑฐ๋ถ์ด : ํ ์นธ์ฉ ์ด๋
2. ํ ๋ผ์ ๊ฑฐ๋ถ์ด๊ฐ ๋ง๋ ๋๊น์ง ์ด๋ํ๋ค.
3. ํ ๋ผ์ ๊ฑฐ๋ถ์ด๊ฐ ๋ง๋๋ฉด ์ฌ์ดํด์ด ์๋ค๊ณ ํ๋จํ๋ค.
4. ํ ๋ผ์ ๊ฑฐ๋ถ์ด๊ฐ ๋ง๋์ง ์์ผ๋ฉด ์ฌ์ดํด์ด ์๋ค๊ณ ํ๋จํ๋ค.
# ์๋ฆฌ #
- ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด ํ ๋ผ์ ๊ฑฐ๋ถ์ด๋ ๊ฒฐ๊ตญ ๋์ ๋๋ฌํ๋ค.
- ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ฉด ํ ๋ผ์ ๊ฑฐ๋ถ์ด๋ ๊ฒฐ๊ตญ ์ฌ์ดํด ๋ด์์ ๋ง๋๋ค.
"""
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
hare = head
tortoise = head
while hare and hare.next:
hare = hare.next.next
tortoise = tortoise.next
if hare is tortoise:
return True
return False- ํจํด: Two Pointers, Fast & Slow Pointers
- ์ค๋ช : ํด๋น ์ฝ๋๋ ํ ๋ผ-๊ฑฐ๋ถ์ด ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๊ฐ์ ํฌ์ธํฐ ๋ ๊ฐ๋ฅผ ์๋ก ๋ค๋ฅธ ์๋๋ก ์์ง์ฌ ์ํ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค. ์ด๋ฅผ ํตํด ํ ๋ฒ์ ํ๋์ ๋ ธ๋๋ฅผ ๊ฑด๋๊ฐ๋ฉฐ ์ํ ์ฌ๋ถ๋ฅผ O(n) ์๊ฐ, O(1) ๊ณต๊ฐ์ผ๋ก ํ์งํ๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ํ ๋ผ์ ๊ฑฐ๋ถ์ด ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์์ฐจ ํ์ ์ค ์ฌ์ดํด ์ฌ๋ถ๋ฅผ ๋น ๋ฅด๊ฒ ํ๋จํ๋ค. ์ถ๊ฐ ๊ณต๊ฐ์ ์์๋ก ์ ์ง๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ ์๋ํ ๋๋ก ๋์ํ์ง๋ง, ์ ๋ ฅ head๊ฐ None์ธ ๊ฒฝ์ฐ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์ด ์ฝ๋๊ฐ ์์ผ๋ฉด ๋ robustํฉ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
๐ alphaorderly ๋์ ํ์ต ํํฉ์ด๋ฒ ์ฃผ ์ ์ถ ๋ฌธ์
๋์ ํ์ต ์์ฝ
๋ฌธ์ ํ์ด ํํฉ
๐ค ์ด ๋๊ธ์ GitHub App์ ํตํด ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค. ๐ข API ์ฌ์ฉ๋ (gpt-5-nano)
|
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
maximum-product-subarray/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(n)
๊ณต๊ฐ๋ณต์ก๋: O(1)
- ๋ง์ฝ ํ์ฌ ์ซ์๊ฐ ์์๋ผ๋ฉด, ์์ ์ต๋๊ฐ(pos)๊ณผ ์์ ์ต์๊ฐ(neg)์ ์๋ก ๊ตํํ๋ค.
- ์ด์ : ์์ * ์์ = ์์์ด๋ฏ๋ก, ์์๋ฅผ ๋ง๋๋ฉด ์ต๋๊ฐ/์ต์๊ฐ ํ๋ณด๊ฐ ๋ฐ๋ ์ ์๋ค.
- pos์ neg๋ฅผ nums์ ์ฒซ ๋ฒ์งธ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ค.
- pos: ํ์ฌ๊น์ง์ ์์ ๊ณฑ์
์ต๋๊ฐ
- neg: ํ์ฌ๊น์ง์ ์์ ๊ณฑ์
์ต์๊ฐ
- ans๋ฅผ nums์ ์ฒซ ๋ฒ์งธ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ค.
- ans: ํ์ฌ๊น์ง์ ์ต๋ ๊ณฑ์
๊ฒฐ๊ณผ
- nums์ ๋ ๋ฒ์งธ ์์๋ถํฐ ๋๊น์ง pos์ neg๋ฅผ ๊ฐฑ์ ํ๋ค.
- pos๋ ํ์ฌ ์ซ์์ pos*ํ์ฌ ์ซ์ ์ค ํฐ ๊ฐ
- neg๋ ํ์ฌ ์ซ์์ neg*ํ์ฌ ์ซ์ ์ค ์์ ๊ฐ
- ans๋ฅผ pos์ ๋น๊ตํ์ฌ ์ต๋๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
- ๋ฐ๋ณต์ด ๋๋๋ฉด ans๋ฅผ ๋ฐํํ๋ค.
"""
class Solution:
def maxProduct(self, nums: List[int]) -> int:
pos = neg = ans = nums[0]
N = len(nums)
for i in range(1, N):
if nums[i] < 0:
neg, pos = pos, neg
pos = max(nums[i], nums[i] * pos)
neg = min(nums[i], nums[i] * neg)
ans = max(ans, pos)
return ans- ํจํด: Dynamic Programming, Two Pointers, Greedy
- ์ค๋ช : ์ฐ์ ๋ถ๋ถ๋ฐฐ์ด์ ์ต๋ ๊ณฑ์ ์ฐพ๊ธฐ ์ํด ์์/์์์ ๊ณฑ์ ํน์ฑ์ ์ด์ฉํ๋ ๋จ์ผ ํจ์ค ํด๋ฒ์ผ๋ก, ํ์ฌ ์์น์ ๊ฐ๊ณผ ์ด์ ๊น์ง์ ์ต๋๊ฐ/์ต์๊ฐ์ ๊ฐฑ์ ํ๋ DP ์ฑ๊ฒฉ์ ์ํ ์ ๊ฐ์ ์ด๋ฅผ ์ด์ฉํ ๊ทธ๋ฆฌ๋์ ์ ํ์ด ๊ฒฐํฉ๋์ด ์์ต๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: pos์ neg๋ฅผ ๊ฐ๊ฐ ํ์ฌ๊น์ง์ ์์/์์ ๊ตฌ๊ฐ์ ์ต๋/์ต์ ๊ณฑ์ผ๋ก ๊ด๋ฆฌํ๋ค. ์์์ ๋ฑ์ฅ ์ ๊ตํ์ด ํต์ฌ์ด๋ค.
๊ฐ์ ์ ์: ํน์ ์ ๋ ฅ์ ๋ํด nums๊ฐ ๋น์ด์์ ์ ์๋ ๊ฒฝ์ฐ์ ๋๋นํ ์ ๋ ฅ ๊ฒ์ฆ์ ์ถ๊ฐํ๋ฉด ์์ ์ฑ์ด ์ฌ๋ผ๊ฐ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
minimum-window-substring/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(n)
๊ณต๊ฐ๋ณต์ก๋: O(1)
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํด ๋ฌธ์์ด s์์ t์ ๋ชจ๋ ๋ฌธ์๋ฅผ ํฌํจํ๋ ์ต์ ์๋์ฐ๋ฅผ ์ฐพ๋๋ค.
Window ํด๋์ค๋ ํ๊ฒ ๋ฌธ์์ด(t)์ ๊ตฌ์ฑ๋ ๊ฐ ๋ฌธ์๋ณ ํ์ํ ๊ฐ์๋ฅผ ์นด์ดํธํ๊ณ ,
์๋์ฐ ๋ด ํด๋น ๋ฌธ์ ๊ฐ์๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ํ์ฌ ์๋์ฐ๊ฐ ํ๊ฒ์ ๋ง์กฑํ๋์ง(check) ํ์ธํ๋ค.
add ๋ฉ์๋๋ ์๋์ฐ์ ๋ฌธ์๋ฅผ ์ถ๊ฐํ์ฌ ๊ฐ์๋ฅผ ๊ฐฑ์ ํ๊ณ ,
- ํ๊ฒ์ ๋ฌธ์ ๊ฐฏ์์ ๊ฐ์์ง๋ฉด key_count๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
remove ๋ฉ์๋๋ ์๋์ฐ์์ ๋ฌธ์๋ฅผ ์ ๊ฑฐํ์ฌ ๊ฐ์๋ฅผ ์ค์ธ๋ค.
- ํ๊ฒ์ ๋ฌธ์ ๊ฐฏ์๋ณด๋ค ์์์ง๋ฉด key_count๋ฅผ ๊ฐ์์ํจ๋ค.
check ๋ฉ์๋๋ ์๋์ฐ์ ํ๊ฒ ๋ฌธ์๊ฐ ํ์ํ ๋งํผ ๋ชจ๋ ํฌํจ๋์ด ์๋์ง ๊ฒ์ฌํ๋ค.
- key_count์ target_count๊ฐ ๊ฐ์ผ๋ฉด True๋ฅผ ๋ฐํํ๋ค.
"""
class Window:
def __init__(self, target: str):
self.target = Counter(target)
self.window = defaultdict(int)
self.key_count = 0
self.target_count = len(self.target)
def check(self):
return self.key_count == self.target_count
def add(self, ch: str):
self.window[ch] += 1
if self.window[ch] == self.target[ch]:
self.key_count += 1
def remove(self, ch: str):
self.window[ch] -= 1
if self.window[ch] < self.target[ch]:
self.key_count -= 1
class Solution:
def minWindow(self, s: str, t: str) -> str:
window = Window(t)
left = 0
ans = (-float("inf"), float("inf"))
for right, value in enumerate(s):
window.add(value)
if not window.check():
continue
while window.check():
window.remove(s[left])
left += 1
if ans[1] - ans[0] > right - left:
ans = (left - 1, right)
if ans[0] == -float("inf"):
return ""
return s[ans[0] : ans[1] + 1]- ํจํด: Sliding Window
- ์ค๋ช : ์ฃผ์ด์ง ์ฝ๋๋ ๊ฐ๋ณ ๊ธธ์ด ์๋์ฐ๋ฅผ ์ผ์ชฝ/์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ก ์กฐ์ ํ๋ฉฐ, ํ๊น ๋ฌธ์์ด์ ๋ชจ๋ ๋ฌธ์๋ฅผ ํฌํจํ๋ ์ต์ ์๋์ฐ๋ฅผ ์ฐพ๋ ๋ก์ง์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์๋์ฐ ๋ด๋ถ ๋ฌธ์๋ฅผ ๊ด๋ฆฌํ๊ณ ์กฐ๊ฑด ์ถฉ์กฑ ์ ์๋์ฐ๋ฅผ ์ถ์ํ๋ ํ๋ฆ์ด Sliding Window ํจํด์ ํด๋นํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: Window ํด๋์ค๋ฅผ ํตํด ํ์ํ ๋ฌธ์ ์๋ฅผ ์ถ์ ํ๊ณ ํค ์นด์ดํธ๋ก ์๋์ฐ๋ฅผ ์ถ์ํ๋ค. ์ถ๊ฐ ์ ๋ณด ๊ด๋ฆฌ๋ก ๊ณต๊ฐ์ ์์๋ก ์ ์งํ๋ค.
๊ฐ์ ์ ์: Window ๊ตฌํ์์ Counter/ defaultdict ์ด๊ธฐํ ๋น์ฉ ๊ณ ๋ ค ์, ์ ๊ท ๋์ ๋๋ฆฌ ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ฌ์ ๊ฒํด ์ฑ๋ฅ ์ฌ์ง๋ฅผ ํ์ธํด๋ณผ ์ ์์ต๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
pacific-atlantic-water-flow/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(m * n)
๊ณต๊ฐ๋ณต์ก๋: O(m * n)
1. ํํ์๊ณผ ๋์์ ๊ฐ๊ฐ์์ ๋ฌผ์ด ๋๋ฌํ ์ ์๋ ์์น๋ฅผ ๊ธฐ๋กํ 2์ฐจ์ ๋ฐฐ์ด(check)์ ๋ง๋ ๋ค.
2. ํํ์๊ณผ ๋ง๋ฟ์ ์นธ๋ค(์ผ์ชฝ ์ด๊ณผ ์์ชฝ ํ)์๋ ํํ์ ๋๋ฌ ๊ฐ๋ฅ(๊ฐ 1), ๋์์๊ณผ ๋ง๋ฟ์ ์นธ๋ค(์ค๋ฅธ์ชฝ ์ด๊ณผ ์๋์ชฝ ํ)์๋ ๋์์ ๋๋ฌ ๊ฐ๋ฅ(๊ฐ 2) ํ์๋ฅผ ํ๋ค.
- 1: ํํ์, 2: ๋์์ โ 2์ง์๋ก๋ ๊ฐ๊ฐ 01, 10์ด๋ผ๋ ์๋ฏธ์.
3. ๊ฐ ๋ฐ๋ค์ ์ธ์ ํ ์นธ๋ค์์ ์์ํด, BFS๋ฅผ ์ด์ฉํด ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ์นธ์ ํ์ฅํ๋ค.
- ์ธ์ ํ ์นธ์ผ๋ก ์ด๋ํ ๋, ํญ์ ์ง๊ธ ์นธ๋ณด๋ค ๋์ด๊ฐ ๊ฐ๊ฑฐ๋ ๋ ๋์ ์นธ์ผ๋ก๋ง ๋ฌผ์ด ํ๋ฅผ ์ ์๋ค(์ฆ, ๋ฌผ์ด ๊ฑฐ์ฌ๋ฌ ํ๋ฅด๋ ์กฐ๊ฑด).
- ์ด๋ฏธ ๊ฐ์ ๋ฐ๋ค์์ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ์นธ์ ๊ฑด๋๋ด๋ค.
- ์๋ก์ด ์์น์ ๋๋ฌํ ๋๋ง๋ค check ๋ฐฐ์ด์ ๊ฐฑ์ ํ๊ณ ํ์ ์ถ๊ฐํ๋ค.
4. ํํ์๊ณผ ๋์์์์ ๋ชจ๋ ๋๋ฌ ๊ฐ๋ฅํ ์นธ(๊ฐ์ด 3์ด ๋ ์นธ)์ ๋ต์ผ๋ก ๋ชจ์ ๋ฐํํ๋ค.
# ๋นํธ๋ง์คํน ๊ธฐ๋ฒ ์ฌ์ฉ ์๋ฆฌ #
- ํํ์๊ณผ ๋์์ ๋ ๋ฐ๋ค์์ ๋๋ฌ ๊ฐ๋ฅํ ์นธ์ ํ์ํ๊ธฐ ์ํด ๋นํธ๋ง์คํน ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
- ๊ฐ ์นธ์ ๋ํด, 1๋นํธ(01)๋ ํํ์(Pacific), 2๋นํธ(10)๋ ๋์์(Atlantic) ๋๋ฌ ๊ฐ๋ฅ์ ์๋ฏธํ๋ค.
- ์๋ฅผ ๋ค์ด ๊ฐ ์นธ์ ๊ฐ์ด 1์ด๋ฉด ํํ์, 2์ด๋ฉด ๋์์, 3์ด๋ฉด ๋ ๋ฐ๋ค ๋ชจ๋์ ๋๋ฌ ๊ฐ๋ฅํ ์นธ์์ ๋ํ๋ธ๋ค.
- bfs/dfs๋ก ์ธ์ ์นธ(์ํ์ข์ฐ)๋ก ํ์ฅํ ๋, ์ด๋ฏธ ํด๋น ๋ฐ๋ค์ ๋นํธ๊ฐ ์ผ์ ธ ์์ผ๋ฉด ๋ฐฉ๋ฌธํ์ง ์๋๋ค.
"""
class Solution:
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
ROW = len(heights)
COL = len(heights[0])
DIR = [
[1, 0],
[0, 1],
[-1, 0],
[0, -1]
]
check = [[0] * COL for _ in range(ROW)]
for r in range(ROW):
check[r][0] |= 1
check[r][COL - 1] |= 2
for c in range(COL):
check[0][c] |= 1
check[ROW - 1][c] |= 2
queue = deque([])
for r in range(ROW):
for c in range(COL):
if check[r][c] != 0:
queue.append((r, c))
def bound(row: int, col: int) -> bool:
return 0 <= row < ROW and 0 <= col < COL
while queue:
r, c = queue.popleft()
for dr, dc in DIR:
tr, tc = r + dr, c + dc
if not bound(tr, tc):
continue
if heights[tr][tc] < heights[r][c]:
continue
if check[tr][tc] | check[r][c] == check[tr][tc]:
continue
check[tr][tc] |= check[r][c]
queue.append((tr, tc))
ans = []
for r in range(ROW):
for c in range(COL):
if check[r][c] == 3:
ans.append([r, c])
return ans- ํจํด: Breadth-First Search, Dynamic Programming, Hash Map / Hash Set
- ์ค๋ช : ์ฃผ์ ๋ก์ง์ด BFS๋ฅผ ์ฌ์ฉํด ๋ ๋ฐ๋ค๋ก ์ฐจ๋ก๋๋ก ๋๋ฌ ์ฌ๋ถ๋ฅผ ํ์ฅํ๋ ๋ฐฉ์์ด๋ฉฐ, ๊ฐ ์นธ์ ์ํ๋ฅผ ๋นํธ๋ง์คํน์ผ๋ก ๊ด๋ฆฌํด ๋ ๋ฐ๋ค์ ๋๋ฌ ์ฌ๋ถ๋ฅผ ํฉ์ณ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ํจํด์ด ๋ณด์ธ๋ค. ๋ํ ์ํ ๊ฐฑ์ ๊ณผ ๋ฐฉ๋ฌธ ์ฌ๋ถ ๊ด๋ฆฌ๊ฐ DP์ ์์ด๋์ด์ ๋นํธ๋ง์คํน์ ํ์ฉ์ผ๋ก ์ฐ๊ฒฐ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(m * n) |
| Space | O(m * n) |
ํผ๋๋ฐฑ: ๊ฐ ์นธ์ ๋ ๋ฐ๋ค ๋๋ฌ ์ฌ๋ถ๋ฅผ ๋นํธ๋ก ํ์ํ๊ณ , ์ ๋ฐฉํฅ์ผ๋ก BFS๋ฅผ ํ์ฅํ๋ค. ์ค๋ณต ๋ฐฉ๋ฌธ ์ต์ํ๊ฐ ํต์ฌ์ด๋ค.
๊ฐ์ ์ ์: ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ณ ์ ๋นํธ๋ง์คํน ๋์ ๋ ๊ฐ์ ๋ ๋ฆฝ ์ฒดํฌ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๋ฐฉ์๋ ๊ณ ๋ ค ๊ฐ๋ฅํ๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
sum-of-two-integers/alphaorderly.py
"""
์๊ฐ๋ณต์ก๋: O(1)
๊ณต๊ฐ๋ณต์ก๋: O(1)
16๋นํธ ์ ์ ๋ฒ์์์ ๊ฐ ๋นํธ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉฐ ๋ง์
์ ์ํํ๋ค.
๊ฐ ๋นํธ์ ํฉ์ XOR ์ฐ์ฐ์ผ๋ก ๊ตฌํ๊ณ ,
์ฌ๋ฆผ์(carry)๋ ๋ ๋นํธ ์ด์์ด 1์ธ ๊ฒฝ์ฐ๋ฅผ OR ์ฐ์ฐ์ผ๋ก ๊ณ์ฐํ๋ค.
- ์ ๊ฐ์ฐ๊ธฐ ์๋ฆฌ ์ ์ฉ
๊ณ์ฐ๋ ๊ฐ ๋นํธ๋ ans์ ํด๋น ์์น์ ์ ์ฅํ๋ค.
Python์ int๋ ๊ณ ์ ๋ ๋นํธ ํญ์ ๊ฐ์ง์ง ์์ผ๋ฏ๋ก,
์ต์ข
๊ฒฐ๊ณผ์ ์ต์์ ๋นํธ๊ฐ 1์ธ ๊ฒฝ์ฐ์๋ 16๋นํธ ์์๋ก ์ง์ ๋ณํํ๋ค.
MASK์ XORํ์ฌ 16๋นํธ ๋ฒ์ ์์์ ๋นํธ๋ฅผ ๋ฐ์ ํ ๋ค,
~ ์ฐ์ฐ์ ์ ์ฉํ์ฌ Python์ ์์ ์ ์ ํํ๋ก ๋ณํํ๋ค.
"""
class Solution:
def getSum(self, a: int, b: int) -> int:
MASK = 0xFFFF
CHECK = 0x8000
ans = carry = left = 0
for i in range(16):
a_bit = a & 1
b_bit = b & 1
left = a_bit ^ b_bit ^ carry
carry = (a_bit & b_bit) | (b_bit & carry) | (a_bit & carry)
ans |= left * 2**i
a >>= 1
b >>= 1
if ans & CHECK == 0:
return ans
else:
return ~(MASK ^ ans)- ํจํด: Bit Manipulation
- ์ค๋ช : ๋ ์ ์์ ๊ฐ ๋นํธ๋ฅผ ์ํํ๋ฉฐ, ๋นํธ ์ฐ์ฐ์ผ๋ก ๋ง์ ์ ๊ตฌํํ๊ณ , ์บ๋ฆฌ์ ํฉ์ ๋นํธ ๋จ์๋ก ๊ณ์ฐํ๋ ๋ฐฉ์์ด๋ค. 16๋นํธ ๊ณ ์ ํญ ๊ฐ์ ๊ณผ ์ต์ข ๋ถํธ ์ฒ๋ฆฌ๋ก ๋นํธ ์กฐ์ ํจํด์ด ํต์ฌ์ด๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(1) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๋นํธ ์ฐ์ฐ์ผ๋ก ๋ง์ ์ ๊ฐ ๋นํธ๋ฅผ ์ฐจ๋ก๋๋ก ๊ณ์ฐํ๊ณ ์ต์ข ์์ ํ์๋ฅผ ์ฒ๋ฆฌํ๋ค. ํ์ด์ฌ์ ๊ฐ๋ณ ์ ์ ํน์ฑ์ ํ์ฉํด ๊ฒฝ๊ณ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
๊ฐ์ ์ ์: ์ ๋ ฅ ์์ ๋ฒ์๋ฅผ ๋ช ์์ ์ผ๋ก ํ์ธํ๊ณ , ๋ ํฐ ๋นํธ ์์์๋ ๋์ํ๋๋ก ์ผ๋ฐํํ๋ ์ ๋ต๋ ๊ณ ๋ คํด๋ณผ ๋งํ๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
|
๊ทธ ์ปค๋ฐ ๋ก๊ทธ ์ด์ํ๊ฑฐ ์๊ณ ์์ผ๋๊น ์ฝ๋ ๊ฐ์ ๋ด์ฉ๋ง๊ณ ๊ทธ๊ฑฐ ์ ์ง ๋ง์์ฃผ์ธ์ ๋ค์์ฃผ๋ถํฐ ๊ด์ฐฎ์์ง๊ฒ๋๋ค. |
๋ต์ ์ ์ถ ๋ฌธ์
์์ฑ์ ์ฒดํฌ ๋ฆฌ์คํธ
In Review๋ก ์ค์ ํด์ฃผ์ธ์.๊ฒํ ์ ์ฒดํฌ ๋ฆฌ์คํธ
Important
๋ณธ์ธ ๋ต์ ์ ์ถ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ถ PR ํ๋ ์ด์์ ๋ฐ๋์ ๊ฒํ ๋ฅผ ํด์ฃผ์ ์ผ ํฉ๋๋ค!