diff --git a/invert-binary-tree/socow.py b/invert-binary-tree/socow.py new file mode 100644 index 0000000000..8164b77d8f --- /dev/null +++ b/invert-binary-tree/socow.py @@ -0,0 +1,74 @@ +""" +๐Ÿ“š 226. Invert Binary Tree + +๐Ÿ“Œ ๋ฌธ์ œ ์š”์•ฝ +- ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์ขŒ์šฐ๋กœ ๋’ค์ง‘๊ธฐ (๊ฑฐ์šธ์ฒ˜๋Ÿผ!) +- ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์™ผ์ชฝ ์ž์‹ โ†” ์˜ค๋ฅธ์ชฝ ์ž์‹ ๊ตํ™˜ + +๐Ÿ“ ๋ฌธ์ œ ์˜ˆ์‹œ + ์ž…๋ ฅ: ์ถœ๋ ฅ: + 4 4 + / \ / \ + 2 7 โ†’ 7 2 + / \ / \ / \ / \ + 1 3 6 9 9 6 3 1 + +๐ŸŽฏ ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ +- ํŒจํ„ด: ์žฌ๊ท€ (DFS) / ๋ฐ˜๋ณต (BFS) +- ์‹œ๊ฐ„๋ณต์žก๋„: O(n) - ๋ชจ๋“  ๋…ธ๋“œ ๋ฐฉ๋ฌธ +- ๊ณต๊ฐ„๋ณต์žก๋„: O(h) - h๋Š” ํŠธ๋ฆฌ ๋†’์ด (์ฝœ์Šคํƒ) + +๐Ÿ’ก ํ•ต์‹ฌ ์•„์ด๋””์–ด +1. ํ˜„์žฌ ๋…ธ๋“œ์˜ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ์ž์‹์„ swap +2. ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ์žฌ๊ท€์ ์œผ๋กœ ๋’ค์ง‘๊ธฐ +3. ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ์žฌ๊ท€์ ์œผ๋กœ ๋’ค์ง‘๊ธฐ +""" + +from typing import Optional +from collections import deque + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + + +# ์žฌ๊ท€ ๋ฐฉ์‹ (๊ฐ€์žฅ ๊ฐ„๋‹จ!) +class Solution: + def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: + if not root: + return None + + # ์™ผ์ชฝ โ†” ์˜ค๋ฅธ์ชฝ swap! + root.left, root.right = root.right, root.left + + # ์ž์‹๋“ค๋„ ์žฌ๊ท€์ ์œผ๋กœ ๋’ค์ง‘๊ธฐ + self.invertTree(root.left) + self.invertTree(root.right) + + return root + + +# BFS ๋ฐฉ์‹ (๋ฐ˜๋ณต) +class SolutionBFS: + def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: + if not root: + return None + + queue = deque([root]) + + while queue: + node = queue.popleft() + + # swap! + node.left, node.right = node.right, node.left + + # ์ž์‹๋“ค ํ์— ์ถ”๊ฐ€ + if node.left: + queue.append(node.left) + if node.right: + queue.append(node.right) + + return root diff --git a/pacific-atlantic-water-flow/socow.py b/pacific-atlantic-water-flow/socow.py new file mode 100644 index 0000000000..c780c33c53 --- /dev/null +++ b/pacific-atlantic-water-flow/socow.py @@ -0,0 +1,76 @@ +""" +๐Ÿ“š 417. Pacific Atlantic Water Flow + +๐Ÿ“Œ ๋ฌธ์ œ ์š”์•ฝ +- m x n ์„ฌ์ด ์žˆ๊ณ , ๊ฐ ์นธ์— ๋†’์ด๊ฐ€ ์žˆ์Œ +- ์™ผ์ชฝ/์œ„ = ํƒœํ‰์–‘(Pacific), ์˜ค๋ฅธ์ชฝ/์•„๋ž˜ = ๋Œ€์„œ์–‘(Atlantic) +- ๋ฌผ์€ ๋†’์€ ๊ณณ โ†’ ๋‚ฎ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ณณ์œผ๋กœ๋งŒ ํ๋ฆ„ +- ๋‘ ๋ฐ”๋‹ค ๋ชจ๋‘์— ๋ฌผ์ด ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ขŒํ‘œ ์ฐพ๊ธฐ! + +๐Ÿ“ ๋ฌธ์ œ ์˜ˆ์‹œ +heights = [ + [1, 2, 2, 3, 5], โ† ํƒœํ‰์–‘ (์œ„) + [3, 2, 3, 4, 4], + [2, 4, 5, 3, 1], + [6, 7, 1, 4, 5], + [5, 1, 1, 2, 4] โ†’ ๋Œ€์„œ์–‘ (์•„๋ž˜) +] +โ†‘ ํƒœํ‰์–‘ (์™ผ์ชฝ) โ†“ ๋Œ€์„œ์–‘ (์˜ค๋ฅธ์ชฝ) + +๊ฒฐ๊ณผ: [[0,4], [1,3], [1,4], [2,2], [3,0], [3,1], [4,0]] + +๐ŸŽฏ ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ +- ํŒจํ„ด: BFS/DFS (์—ญ๋ฐฉํ–ฅ ํƒ์ƒ‰) +- ์‹œ๊ฐ„๋ณต์žก๋„: O(m ร— n) +- ๊ณต๊ฐ„๋ณต์žก๋„: O(m ร— n) + +๐Ÿ’ก ํ•ต์‹ฌ ์•„์ด๋””์–ด +1. ์ •๋ฐฉํ–ฅ(๋†’โ†’๋‚ฎ)์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด ๋ชจ๋“  ์ ์—์„œ ์‹œ์ž‘ํ•ด์•ผ ํ•จ (๋น„ํšจ์œจ) +2. ์—ญ๋ฐฉํ–ฅ(๋ฐ”๋‹คโ†’์„ฌ)์œผ๋กœ! ๋ฐ”๋‹ค์—์„œ ์‹œ์ž‘ํ•ด์„œ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ ํƒ์ƒ‰ +3. ํƒœํ‰์–‘์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ + ๋Œ€์„œ์–‘์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ = ์ •๋‹ต! +""" + +from typing import List +from collections import deque + + +class Solution: + def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]: + if not heights: + return [] + + m, n = len(heights), len(heights[0]) + + # ๊ฐ ๋ฐ”๋‹ค์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ขŒํ‘œ ์ €์žฅ + pacific = set() + atlantic = set() + + def bfs(starts, reachable): + queue = deque(starts) + reachable.update(starts) + + while queue: + r, c = queue.popleft() + + # ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰ + for dr, dc in [(-1, 0), (1, 0), (0, -1), (0, 1)]: + nr, nc = r + dr, c + dc + + # ๋ฒ”์œ„ ๋‚ด & ์•„์ง ์•ˆ ๊ฐ & ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์Œ (์—ญ๋ฐฉํ–ฅ!) + if (0 <= nr < m and 0 <= nc < n + and (nr, nc) not in reachable + and heights[nr][nc] >= heights[r][c]): + queue.append((nr, nc)) + reachable.add((nr, nc)) + + # ํƒœํ‰์–‘: ์™ผ์ชฝ + ์œ„์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ์‹œ์ž‘ + pacific_starts = [(i, 0) for i in range(m)] + [(0, j) for j in range(n)] + bfs(pacific_starts, pacific) + + # ๋Œ€์„œ์–‘: ์˜ค๋ฅธ์ชฝ + ์•„๋ž˜์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ์‹œ์ž‘ + atlantic_starts = [(i, n-1) for i in range(m)] + [(m-1, j) for j in range(n)] + bfs(atlantic_starts, atlantic) + + # ๊ต์ง‘ํ•ฉ = ๋‘ ๋ฐ”๋‹ค ๋ชจ๋‘ ๋„๋‹ฌ ๊ฐ€๋Šฅ! + return list(pacific & atlantic) +