๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿงฉ 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.