Skip to content

Commit

Permalink
Merge pull request #614 from mangodm-web/main
Browse files Browse the repository at this point in the history
[mangodm-web] Week15 Solutions
  • Loading branch information
SamTheKorean authored Nov 24, 2024
2 parents 0991abb + 814dc18 commit ac2c3d5
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 0 deletions.
30 changes: 30 additions & 0 deletions longest-palindromic-substring/mangodm-web.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
class Solution:
def is_palindrome(self, s: str) -> bool:
return s == s[::-1]

def longestPalindrome(self, s: str) -> str:
"""
- Idea: ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์—์„œ ๊ฐ€์žฅ ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ฐพ๋Š”๋‹ค.
1. ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ƒ์„ฑ
2. ๊ฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ํ™•์ธ
3. ๊ฐ€์žฅ ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ €์žฅํ•˜๊ณ  ๋ฐ˜ํ™˜
- Time Complexity: O(n^3). n์€ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
๋ชจ๋“  ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๋Š”๋ฐ O(n^2), ๊ฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ์•Œ์•„๋‚ด๋Š”๋ฐ O(n).
๊ฒฐ๊ตญ O(n^3)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.
- Space Complexity: O(n). n์€ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ํ™•์ธํ•  ๋•Œ ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์‹ฑ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,
์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์™€ ๊ฐ™์•„
๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.
"""

result = s[0]

for i in range(len(s) - 1):
for j in range(i + 1, len(s) + 1):
if j - i <= len(result):
continue

if self.is_palindrome(s[i:j]) and (j - i) > len(result):
result = s[i:j]

return result
47 changes: 47 additions & 0 deletions subtree-of-another-tree/mangodm-web.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
from typing import Optional


class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right


class Solution:
def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
if not subRoot:
return True
if not root:
return False

if self.isSameTree(root, subRoot):
return True

has_subroot_in_left = self.isSubtree(root.left, subRoot)
has_subroot_in_right = self.isSubtree(root.right, subRoot)

return has_subroot_in_left or has_subroot_in_right

def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
"""
- Idea: ๋‘ ํŠธ๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋…ธ๋“œ ๋‹จ์œ„๋กœ ๋น„๊ตํ•œ๋‹ค.
1. ๋‘ ๋…ธ๋“œ๊ฐ€ ๋ชจ๋‘ None์ด๋ผ๋ฉด ํ˜„์žฌ ๋‘ ํŠธ๋ฆฌ๋Š” ๋™์ผ
2. ๋‘ ๋…ธ๋“œ๊ฐ€ None์ด ์•„๋‹ˆ๊ณ  ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด, ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋น„๊ต
3. ๋‘ ๋…ธ๋“œ๊ฐ€ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ํ•œ์ชฝ๋งŒ None์ด๋ฉด ๋‘ ํŠธ๋ฆฌ๋Š” ์ƒ์ด
- Time Complexity: O(m). m์€ ๋” ์ž‘์€ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ์ˆ˜
๊ฐ ๋…ธ๋“œ๋ฅผ ํ•œ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•˜๋ฏ€๋กœ O(m) ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
- Space Complexity: O(h). h๋Š” ๋” ์ž‘์€ ํŠธ๋ฆฌ์˜ ๋†’์ด
์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ์— ์ตœ๋Œ€ h๋งŒํผ์˜ ๊ณต๊ฐ„์ด ์‚ฌ์šฉ๋œ๋‹ค.
"""

if not p and not q:
return True

if p and q and p.val == q.val:
is_left_equal = self.isSameTree(p.left, q.left)
is_right_equal = self.isSameTree(p.right, q.right)

return is_left_equal and is_right_equal

return False
37 changes: 37 additions & 0 deletions validate-binary-search-tree/mangodm-web.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from typing import Optional


# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right


class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
"""
- Idea: ๊ฐ ๋…ธ๋“œ ๊ฐ’์˜ ํ—ˆ์šฉ ๋ฒ”์œ„๋ฅผ ์ •ํ•˜๊ณ  ์žฌ๊ท€์ ์œผ๋กœ ๊ฒ€์‚ฌํ•œ๋‹ค.
1. BST์˜ ์ •์˜ ํ™œ์šฉ
์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๊ฐ’์€ ํ˜„์žฌ ๋…ธ๋“œ ๊ฐ’๋ณด๋‹ค ์ž‘๊ณ , ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๊ฐ’์€ ํ˜„์žฌ ๋…ธ๋“œ ๊ฐ’๋ณด๋‹ค ํผ.
2. ์ดˆ๊ธฐ๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ (-inf, inf)๋กœ ์„ค์ •
3. ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์„ ๊ฒ€์‚ฌํ•˜๊ณ , ๋ฒ”์œ„๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์„œ ์žฌ๊ท€์ ์œผ๋กœ ์„œ๋ธŒ ํŠธ๋ฆฌ ํ™•์ธ
- Time Complexity: O(n). n์€ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ์ˆ˜
๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•œ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•œ๋‹ค.
- Space Complexity: O(h). h๋Š” ํŠธ๋ฆฌ์˜ ๋†’์ด
์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ์ด ํŠธ๋ฆฌ์˜ ๋†’์ด๋งŒํผ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•œ๋‹ค.
ํŽธํ–ฅ๋œ ํŠธ๋ฆฌ๋ผ๋ฉด O(n)์ด ํ•„์š”ํ•˜๋‹ค.
"""

def isValid(node: Optional[TreeNode], low: float, high: float) -> bool:
if not node:
return True
if not (node.val < high and node.val > low):
return False

return isValid(node.left, low, node.val) and isValid(
node.right, node.val, high
)

return isValid(root, float("-inf"), float("inf"))

0 comments on commit ac2c3d5

Please sign in to comment.