[TIL_Carrotww] 95 - 23/01/30

μœ ν˜•μ„Β·2023λ…„ 1μ›” 30일
0

TIL

λͺ©λ‘ 보기
110/138
post-thumbnail

πŸ“Carrotww의 μ½”λ”© 기둝μž₯

🧲 python algorithm interview

πŸ” Leetcode 78 Subsets - Medium

  • λ‚΄ 풀이
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        result = []
        def dfs(num_list, index):
            result.append(num_list[:])

            for i in range(index, len(nums)):
                num_list.append(nums[i])
                dfs(num_list, i+1)
                num_list.pop()
        dfs([], 0)

        return result
  • μ±… 풀이
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        result = []

        def dfs(index, path):
            result.append(path)
            for i in range(index, len(nums)):
                dfs(i+1, path + [nums[i]])
        dfs(0, [])
        return result

기본만 μ•Œλ©΄ ν’€ 수 μžˆλŠ” λ¬Έμ œλ‹€.

πŸ” Leetcode 332 Reconstruct Itinerary - Hard

  • 처음 풀이
class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        result = []
        visited = [0 for _ in range(len(tickets))]
        tickets.sort()

        def dfs(path, visit):
            if len(path) == len(tickets) + 1:
                result.append(path[:])
            for index, val in enumerate(tickets):
                if val[0] == path[-1] and visit[index] == 0:
                    path.append(val[1])
                    visit[index] = 1
                    dfs(path, visit[:])
                    path.pop()
                    visit[index] = 0
        dfs(["JFK"], visited)
        result.sort()

        return result[0]

처음 ν’€μ—ˆλ˜ 풀이인데 μ‹œκ°„μ΄ˆκ³Ό λ‚œ 풀이이닀.
visitedλ₯Ό λ§Œλ“€μ–΄ λͺ©μ μ§€κΉŒμ§€μ˜ λͺ¨λ“  경우λ₯Ό λ§Œλ“€κ³  μ‚¬μ „μˆœμœΌλ‘œ μ •λ ¬ν•œ ν›„
κ°€μž₯ μ•žμ—μžˆλŠ” 값을 λ°˜ν™˜ν•œλ‹€.
ν•˜μ§€λ§Œ

  • μ±… stack 풀이
class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        from collections import defaultdict
        graph = defaultdict(list)
        tickets.sort(reverse=True)
        for a, b in tickets:
            graph[a].append(b)

        result = []
        stack = ["JFK"]
        while stack:
            while graph[stack[-1]]:
                stack.append(graph[stack[-1]].pop())
            result.append(stack.pop())
        return result[::-1]

이 문제λ₯Ό ν’€λ©΄μ„œ κ°€μž₯ κ³ λ €ν•΄μ•Ό ν–ˆλ˜ 뢀뢄이 μ‚¬μ „μˆœμœΌλ‘œ μ •λ ¬ ν›„ λ‚˜μ—΄ν–ˆμ„λ•Œ λ‹€μŒ
행선지가 λŠκΈ°λŠ” κ²½μš°μ˜€λŠ”λ°

result.append(stack.pop())

λ§‰νžˆλŠ” λΆ€λΆ„μ—μ„œ λΉΌμ€€λ‹€.

  • DFS 풀이
class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        from collections import defaultdict
        graph = defaultdict(list)
        tickets.sort(key=lambda x:x[1], reverse=True)
        for start, end in tickets:
            graph[start].append(end)

        result = []
        def dfs(start):
            while graph[start]:
                dfs(graph[start].pop())
            result.append(start)
        dfs("JFK")

        return result[::-1]

μ΄ν•΄ν•˜λŠ”λ° μ’€ κ±Έλ Έμ§€λ§Œ λ§‰νžˆλŠ” λΆ€λΆ„μ˜ 예제λ₯Ό κ·Έλ €κ°€λ©° 보면 이해가 λœλ‹€.
ν•˜μ§€λ§Œ 이 ν’€μ΄λŒ€λ‘œ λ‹€μ‹œ ν’€ 수 μžˆμ„κΉŒ μ‹Άλ‹€...
많이 더 풀어봐야겠닀.

🧲 python algorithm dfs μ—°μŠ΅

πŸ” Leetcode 112 Path Sum - Easy

# 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 hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        if not root:
            return False
        if not root.left and not root.right and targetSum - root.val == 0:
            return True

        return self.hasPathSum(root.left, targetSum - root.val) or self.hasPathSum(root.right, targetSum - root.val)

이건 쉽닀 μž¬κ·€λ‘œ ν’€μ—ˆλ‹€.

πŸ” Leetcode 98 Validate Binary Search Tree - Medium

# 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:
        import math
        return self.Recursion(root, -math.inf, math.inf)

    def Recursion(self, node, min, max):
        if not node:
            return True
        if node.val <= min or node.val >= max:
            return False
        return self.Recursion(node.left, min, node.val) and self.Recursion(node.right, node.val, max)

μ²˜μŒμ— ν•¨μˆ˜λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ§€ μ•Šκ³  ν’€λ €λ‹€κ°€ λͺ»ν’€κ³  힌트λ₯Ό 보고 ν•¨μˆ˜λ₯Ό ν•˜λ‚˜ 더 λ§Žλ“€μ–΄μ„œ ν’€μ—ˆλ‹€. μœ„ 문제λ₯Ό μž¬κ·€λ‘œ ν’€μ—ˆμ–΄μ„œ 이 λ¬Έμ œλ„ λ˜‘κ°™μ΄ μ‹œλ„ν•΄λ΄€λŠ”λ° min, maxλ₯Ό 계속 λ„˜κΈΈ 수 μ—†μ–΄μ„œ μœ„μ™€κ°™μ΄ ν’€μ—ˆλ‹€.

profile
Carrot_hyeong

0개의 λŒ“κΈ€