๐งฉ Algorithm17 ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (Dynamic Programming) Goal 1. ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์ดํดํ๊ธฐ 2. Top-down๊ณผ bottom-up ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(Dynamic Programing)์ด๋? ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ด๋ ์ด๋ค ๋ฌธ์ ๊ฐ ์ฃผ์ด์ก์ ๋ ๊ทธ ๋ฌธ์ ๋ฅผ ๋ ์์ ๋จ์์ ๋ฌธ์ ๋ค๋ก ์ชผ๊ฐ์ ์์ ๋ฌธ์ ๋ถํฐ ํ์ด๋๊ฐ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ ์์ ๋จ์๋ก ์ชผ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํ์ด์ ์ป์ ๊ฒฐ๊ณผ๋ก ์๋ ๋ฌธ์ ์ ํด๋ต์ ์ ์ ๋ ๊ฐ๊น์์ง๋ ๋ฐฉ์์ด๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ํ์ ์ ๋ฌธ์ ๋ฅผ ์์ ๋จ์๋ก ์ชผ๊ฐค ์ ์์ ๋๋ง ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๊ฐ์ฅ ํํ ์์ ๊ฐ ๋ฐ๋ก ํผ๋ณด๋์น ์ซ์์ด๋ค. ํผ๋ณด๋์น ์ซ์๋ ๊ทธ ์ ์ ์ค๋ ๋ ์ซ์๋ฅผ ๊ณ์ํด์ ๋ํด ๋๊ฐ๊ธฐ ๋๋ฌธ์ n๋ฒ์งธ ์ซ์๋ฅผ ์์๋ด๊ธฐ ์ํด์ ์ฒ์๋ถํฐ ๊ณ์ ๋ํด์ค๋ฉด ๋๋ค. ๋ ์ซ์์ฉ ๋ํ๋ ์์ ๋จ.. 2023. 6. 13. ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy algorithm)์ด๋? Goal 1. ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด๊ธฐ 2. ์์ ๋ฌธ์ ํ์ด๋ณด๊ธฐ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋? ๊ทธ๋ฆฌ๋(Greedy)๋ ๋จ์ด๋ ํ์์ด๋ ๋ป์ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ์ฝ๊ฒ ์๊ฐํด์ ์ฝ๋ฉ ๋ฌธ์ ๋ฅผ ํ ๋ ์์ฌ์์ด์ฒ๋ผ ์ง๊ธ ํ์ฌ ๊ฐ์ฅ ์ข์ ์ ํ, ๊ฐ์ฅ ์ต์ ์ ์ ํ๋ง ํ๋ฉด ๋๋ค! ๋์ค์ ์ด๋ป๊ฒ ๋๋ ๊ฐ์ ์ผ๋จ์ ์ ์ผ ์ต์ ์ ์ ํ์ ๊ณ์ ํด๋๊ฐ๋ฉด์ ์ ์ฒด์ ์ผ๋ก๋ ๊ทธ๋ฅ ์ต์ ์ ์ ํ์ด์๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ฒ์ด๋ค. ์์ ๋ฌธ์ (๋ฐฑ์ค 5585๋ฒ) ์๋์ ์ฃผ๋๋ฐ ๊ฑฐ์ค๋ฆ๋ ๊ฐ์๊ฐ ๊ฐ์ฅ ์ ์ ๋ง๋ค์ด๋ณด๋ ๋ฌธ์ ์ด๋ค. ์๋์ผ๋ก๋ 500์, 100์, 50์, 10์, 5์, 1์์ด ๋ฌดํ๊ฐ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. Hint 1. ๊ฐ์๊ฐ ๊ฐ์ฅ ์ ์ผ๋ ค๋ฉด ๊ธ์ก์ด ํฐ๊ฑฐ๋ถํฐ ์ฃผ๋ฉด ๋ ๊น ์์๊ฑฐ๋ถํฐ ์ฃผ๋ฉด ๋ ๊น? ํด๊ฒฐ # ๋ฌธ์ ์์ ์ค ์ ๋ ฅ๊ฐ์ ๋ด์ผํ ๊ธ์ก์ด๋ฏ.. 2023. 5. 12. [LeetCode] 2181๋ฒ: ๊ธฐ์กด ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ ํ๊ธฐ Hint 1. ์ด๋ป๊ฒ ํ๋ฉด ํฌ์ธํฐ 2๊ฐ๋ฅผ ์ด์ฉํด์ ๊ธฐ์กด ๋ฆฌ์คํธ๋ฅผ ์ํ๋ ๊ฒฐ๊ณผ๋ก ์์ ํ ์ ์์๊น? 2. ํฌ์ธํฐ 1๊ฐ๋ ์์ ํ๋ ๋ ธ๋ ์์น์ (a), ๋ค๋ฅธ ํ๋๋ ๋ฆฌ์คํธ ์ ์ฒด๋ฅผ ํ์ธํ๋ ์ฉ๋(b)๋ก ์ด์ฉํด๋ณด์! 3. ์์ง์ด๋ ํฌ์ธํฐb๊ฐ ๊ทธ ๋ค์ 0์ ๋๋ฌํ ๋๊น์ง ์ซ์๋ค์ ์์ ํ๋ ํฌ์ธํฐa ์์น์ ๋ํ๋ฉด ๋๋ค. 4. ๋ง์ง๋ง ๋ ธ๋๋ null์ ์ฐ๊ฒฐ๋๋๋ก ๋ฐ๊ฟ์ผํ๋ค. LeetCode 2181๋ฒ: Merge Nodes in Between Zeros (ํ์ด๋ณด๊ธฐ) class Solution: def mergeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]: # ํฌ์ธํฐ 2๊ฐ ๋ง๋ค๊ธฐ # now = ๋ง์ ํ ํฌ์ธํฐ ์์น # pointer = ๋ฆฌ์คํธ ์ ์ฒด๋ฅผ ํ์ธํ .. 2023. 4. 30. [LeetCode] 1828๋ฒ: ์ ์์ ์ ๊ฐ์ Hint 1. ์๊ณผ ์ ๋ค์ ์ต๋ ๊ฐ์๊ฐ ๊ฐ๊ฐ 500๊ฐ์ด๊ธฐ ๋๋ฌธ์ for๋ฌธ 2๊ฐ๋ฅผ ์ฌ์ฉํด์ ์ผ์ผ์ด ๋น๊ตํด๋ ๋๋ค 2. Follow up์ O(n)์ผ๋ก ํ์ด๋ณด๋ผ๊ณ ๋์ด์์ง๋ง ์ด๊ฑด ๋์ค์ ๋์ ...^^ LeetCode 1828๋ฒ: Queries on Number of Points Inside a Circle (ํ์ด๋ณด๊ธฐ) class Solution: def countPoints(self, points: List[List[int]], queries: List[List[int]]) -> List[int]: # points๋ฅผ x, y ์์๋ก ์์ ์ซ์๋ถํฐ ํฐ ์ซ์๊น์ง ์ ๋ ฌํ๋ค points = sorted(points, key=lambda x: (x[0],x[1])) answer = [] for query in que.. 2023. 4. 28. [LeetCode] 876๋ฒ: ์ฐ๊ฒฐ ๋ฆฌ์คํธ Goal 1. ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ดํดํ๊ธฐ 2. ๊ฐ์ฅ ๊ฐ๋จํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด๋ณด๊ธฐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Linked List)๋? ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ฆฌ์คํธ ์์ ์๋ ํญ๋ชฉ๋ค์ด ๊ทธ ๋ค์ ์์๋ก ์ค๋ ํญ๋ชฉ๊ณผ ์ฐ๊ฒฐ๋์ด ์ ํด์ง ์์๋ก ๋ฌถ์ฌ ์๋ ๋ฆฌ์คํธ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค. LeetCode 876๋ฒ: Middle of the Linked List (ํ์ด๋ณด๊ธฐ) Hint 1. head๋ผ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌ์กฐ์ ์ ์ : head.val = ํ์ฌ ์์น์ ์ head.next= ๋ค์ ์ฐ๊ฒฐ๋ ๋ฆฌ์คํธ 2. ์ด ๊ฐ์๊ฐ 1๊ฐ์ผ ๋๋ ํ์ฌ ์์น์ ์ค๊ฐ ์ง์ ์ ์์น๊ฐ ๊ฐ๋ค 3. ์ฐ๊ฒฐ๋ ๋ฆฌ์คํธ์ ๊ฐ์๊ฐ ํ๋์ฉ ๋์ด๋ ๋๋ง๋ค ํ์ฌ ์์น์ ์ค๊ฐ ์ง์ ์ ์์น๊ฐ ์ด๋ป๊ฒ ๋ณํ๋์ง ์๊ฐํด๋ณด์ 4. ์ด ๊ฐ์๊ฐ ํ์์ผ ๋์ ์ง์์ผ ๋ ํ์ฌ ์์น์ ์ค๊ฐ ์ง์ ์ .. 2023. 3. 11. [LeetCode] 226๋ฒ: Invert Binary Tree Hint 1. DFS ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉํด์ผํจ 2. ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ์์ ๋ ธ๋๊ฐ ์๋ค๋ฉด ๋ฐ๊ฟ์น๊ธฐ ํด์ฃผ๋ฉด ๋จ LeetCode 226๋ฒ: Invert Binary Tree (ํ์ด๋ณด๊ธฐ) class Solution: def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: def dfs(root): # ๋ ธ๋์ธ์ง ํ์ธ. ๋ ธ๋๊ฐ ์๋๋ผ๋ฉด None ๊ฐ์ด๊ธฐ ๋๋ฌธ์ not์ ํด์ค์ผ True๊ฐ ๋จ if not root: return root# ๋ ธ๋๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ฐ๊ฟ์น๊ธฐ ์ํ๊ณ ๊ทธ๋ฅ ๋ฐํ dfs(root.left)# ์ผ์ชฝ ๋ ธ๋์ ์์ ๋ ธ๋ ๋ค์ง๊ธฐ dfs(root.right)# ์ค๋ฅธ์ชฝ ๋ ธ๋์ ์์ ๋ ธ๋ ๋ค์ง๊ธฐ # ์ผ์ชฝ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ๋ ธ๋ ๋ฐ๊ฟ์น๊ธฐ root.le.. 2023. 3. 10. [LeetCode] 2236๋ฒ: ํธ๋ฆฌ ๊ตฌ์กฐ Goal 1. ํธ๋ฆฌ ๊ตฌ์กฐ ์ดํดํ๊ธฐ 2. ๊ฐ์ฅ ๊ฐ๋จํ ํธ๋ฆฌ ๊ตฌ์กฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด๋ณด๊ธฐ ํธ๋ฆฌ ๊ตฌ์กฐ๋? ํธ๋ฆฌ ๊ตฌ์กฐ๋ ๋ ธ๋(Node)์ ์์๋ ธ๋(Child Node)๋ก ๊ตฌ์ฑ๋ ๊ตฌ์กฐ๋ฅผ ์๊ธฐํ๋ค. ๊ฐ์ฅ ํํ ๋ณด๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ ๋ฐ์ด๋๋ฆฌ ํธ๋ฆฌ ๊ตฌ์กฐ(Binary Tree)๋ก ๊ฐ ๋ ธ๋๊ฐ ์ผ์ชฝ ์ค๋ฅธ์ชฝ์ผ๋ก ์์๋ ธ๋ 2๊ฐ๋ฅผ ๊ฐ์ง ํํ๋ค. LeetCode 2236๋ฒ: Root Equals Sum of Children (ํ์ด๋ณด๊ธฐ) Hint 1. root๋ผ๋ ํธ๋ฆฌ ๊ตฌ์กฐ์ ์ ์ : root.val = ํ์ฌ ๋ ธ๋์ ์ root.left = ํ์ฌ ๋ ธ๋์ ์ผ์ชฝ ์์๋ ธ๋ root.right= ํ์ฌ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์๋ ธ๋ 2. root.val์ด ํ์ฌ ๋ ธ๋์ ์๋ผ๋ฉด root.left ๋ ธ๋์ ์๋ฅผ ๊ตฌํ๋ ค๋ฉด? (์ ๋ต์ ๋ฐ์ ํ์ด๋ผ์ดํธํ๋ฉด ๋ณด์) .. 2023. 3. 9. [๋ฐฑ์ค] 10808๋ฒ: ์ํ๋ฒณ ๊ฐ์ Hint 1. ์ํ๋ฒณ ๊ฐ์๋ ์ด 26๊ฐ๋ก ์ ํด์ ธ ์๋ค. 2. ord()์ ์ฌ์ฉํ๋ฉด ์ํ๋ฒณ์ ์์คํค ์ซ์๋ก ๋ณํํ ์ ์๋ค. 3. ord('a')๋ 97์ด๋ค. ๋ฐฑ์ค 10808๋ฒ: ์ํ๋ฒณ ๊ฐ์ (ํ์ด๋ณด๊ธฐ) # ์ํ๋ฒณ ๊ฐ์๋ฅผ ์ ์ ์๊ฒ ๋ฏธ๋ฆฌ 0์ผ๋ก ๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ์ค๋ค alphabet = [0 for i in range(26)] for char in input(): # ord('a')๋ 97์ด๊ธฐ ๋๋ฌธ์ 97์ ๋นผ๋ฉด alphabet ๋ฆฌ์คํธ์์ 0๋ฒ์งธ๋ก ๊ฐ์ ์ถ๊ฐํ ์ ์๋ค alphabet[ord(char) - 97] += 1 # ๋ฆฌ์คํธ๋ join์ ์จ์ string ํํ๋ก ํฉ์น ์ ์๋ค. ์ด๋, ๋ฆฌ์คํธ์ ๋ค์ด์๋ ๊ฐ๋ค์ string์ด์ด์ผ ํ๋ค print(' '.join(map(str, alphabet))) 2023. 3. 6. [๋ฐฑ์ค] 1927๋ฒ: ์ต์ ํ Hint 1. ํ ์๋ฃ๊ตฌ์กฐ ์ด์ฉํ๊ธฐ (ํ์ด๋?) 2. ํ์์ heappop()์ ํ๋ฉด ๊ฐ์ฅ ์์ ๊ฐ์ด ๋ฐํ ๋จ ๋ฐฑ์ค 1927๋ฒ: ์ต์ ํ import heapq import sys n = int(sys.stdin.readline()) heap = [] # ํ ๋ง๋ค๊ธฐ(๋ฆฌ์คํธ๋ ๋ง๋๋ ๋ฒ์ ๋๊ฐ์) for i in range(n): num = int(sys.stdin.readline()) if num == 0: # input ์ซ์๊ฐ 0 ์ด๋ฉด ํ์ฌ ํ์ ๋ค์ด์๋ ์ต์๊ฐ ์ถ๋ ฅํ๊ธฐ print(heapq.heappop(heap) if heap != [] else 0) # ํ์ด ๋น์ด์์ง ์์ ๋๋ง heappop() ํ๊ธฐ else: heapq.heappush(heap, num) # ํ์ ์ซ์ ๋ฃ๊ธฐ 2023. 2. 28. ์ด์ 1 2 ๋ค์