Skip to main content

Command Palette

Search for a command to run...

[์ฝ”ํ…Œ] DFS vs BFS

์–ธ์ œ ๋ญ˜ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ?

Published
[์ฝ”ํ…Œ] DFS vs BFS
๐Ÿ’ก
DFS : ์„ฑ๊ณต์ด๋˜ ์‹คํŒจ๋˜ ๋๊นŒ์ง€ ํ•œ ๊ฒฝ๋กœ๋งŒ
๐Ÿ’ก
BFS : ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ํ•œ ๋‹จ๊ณ„์”ฉ ๊ฒ€์ƒ‰ -> ์งง์€ ๊ฒฝ๋กœ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋„๋‹ฌํ•จ

์„ ํƒ์ง€

  1. DFS or BFS ์–ด๋–ค๊ฒƒ์ด๋“  ์‚ฌ์šฉํ•ด๋„ ๋ฌด๊ด€ํ•œ ๊ฒฝ์šฐ

  2. DFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์••๋„์ ์œผ๋กœ ํŽธํ•œ๊ฒฝ์šฐ

  • ์ˆœ์—ด & ์กฐํ•ฉ ๊ตฌํ˜„ (์ˆซ์ž ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ +, - ๊ฒฐ๊ณผ๊ฐ’์ด ํƒ€๊ฒŸ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜)

    https://school.programmers.co.kr/learn/courses/30/lessons/43165

      # ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํƒ€๊ฒŸ๋„˜๋ฒ„
      def solution(numbers, target):
          global count 
          count = 0
          n = len(numbers)
    
          def dfs(i, total):
              global count
              if i == len(numbers): # ๋ชจ๋“  ์ˆซ์ž๋ฅผ ๋‹ค ํ™œ์šฉํ–ˆ๋Š”์ง€
                  if target == total: # ํƒ€๊ฒŸ ์ˆซ์ž์™€ ๋™์ผํ•œ์ง€
                      count += 1
                  return # ํ™œ์šฉํ–ˆ์ง€๋งŒ ํƒ€๊ฒŸ๊ณผ ๋™์ผํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ทธ๋ƒฅ ๋ฆฌํ„ด
    
              dfs(i+1, total+numbers[i])
              dfs(i+1, total-numbers[i])
    
          dfs(0, 0)
          return count
    
  • ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„๋ฅผ ์™„์ „ํžˆ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๋•Œ (์ฃผ์–ด์ง„ ๋ชจ๋“  ๋น„ํ–‰๊ธฐ ํ‹ฐ์ผ“์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์˜ ์กฐ๊ฑด)

    • BFS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฒซ ๊ฒฝ๋กœ์—์„œ ๊ฐˆ ๊ณณ์ด ์—†๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ๋ฒˆ๊ฑฐ๋กญ๋‹ค

      https://school.programmers.co.kr/learn/courses/30/lessons/43164

    •   from collections import defaultdict
      
        def solution(tickets):
            graph = defaultdict(list)
      
            for (start, end) in tickets:
                graph[start].append(end)
      
            for airport in graph:
                graph[airport].sort(reverse=True)
      
            path = []
            stack = ["ICN"]
            while stack:
                route = stack[-1]
                if not graph[route]:
                    path.append(stack.pop())
                else:
                    next_route = graph[route].pop()
                    stack.append(next_route)
      
            return path[::-1]
      
  1. BFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์••๋„์ ์œผ๋กœ ํŽธํ•œ๊ฒฝ์šฐ

  • ์ตœ๋‹จ ๊ฒฝ๋กœ ํƒ์ƒ‰ (2์ฐจ์› ๋ฐฐ์—ด์—์„œ ๋ฒฝ์„ ํ”ผํ•ด ๋ชฉ์ ์ง€์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋ฆฌ์˜ ์ตœ๋‹จ)

    https://school.programmers.co.kr/learn/courses/30/lessons/1844

      # ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ฒŒ์ž„ ๋งต ์ตœ๋‹จ๊ฑฐ๋ฆฌ
      from collections import deque
    
      def solution(maps):
          # ์ƒํ•˜์ขŒ์šฐ
          dx = [-1, 1, 0, 0]
          dy = [0, 0, -1, 1]
    
          def bfs(x, y):
              queue = deque()
              queue.append((x, y))
              while queue:
                  x, y = queue.popleft()
                  for i in range(4): # ์ƒํ•˜์ขŒ์šฐ ์›€์ง์ด๊ธฐ
                      nx = x + dx[i]
                      ny = y + dy[i]
                      if nx < 0 or ny < 0 or nx >= n or ny >= m: # ์ขŒํ‘œ ๋ฒ”์œ„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ
                          continue
                      if maps[nx][ny] == 0: # ๋ฒฝ์ธ ๊ฒฝ์šฐ
                          continue
                      if maps[nx][ny] == 1: # ์˜ฎ๊ฒจ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
                          queue.append((nx, ny))
                          maps[nx][ny] = maps[x][y] + 1
    
          min_count = int(1e9)
          n, m = len(maps), len(maps[0])
    
          bfs(0, 0)
          answer = maps[n-1][m-1] if maps[n-1][m-1] != 1 else -1   
    
          return answer
    
    • BFS๋Š” ์‹œ์ž‘ ์ง€์ ์—์„œ ๊ฐ€๊นŒ์šด ์ •์ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰ํ•ด ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๋จผ์ € ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. BFS๋Š” ํƒ์ƒ‰ ๊ณผ์ •์—์„œ ๋ฐฉ๋ฌธํ•œ ์ •์ ์„ ํ์— ์ €์žฅํ•˜์—ฌ FIFO ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ, ๋ชฉ์ ์ง€์— ๋จผ์ € ๋„์ฐฉํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ทธ ๋•Œ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๋œ๋‹ค.

      ๋ฐ˜๋ฉด์— DFS๋Š” ์Šคํƒ ๋˜๋Š” ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊นŠ์ด๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ, ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ์ตœ์ข… ๋ชฉ์ ์ง€๊นŒ์ง€ ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•œ ํ›„์—์•ผ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฌธ์ œ์—๋Š” BFS๊ฐ€ ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค.

More from this blog

[์ฝ”ํ…Œ] ๊ทธ๋ฆฌ๋”” ๋ฌธ์ œ - ๋ฌด์ง€์˜ ๋จน๋ฐฉ ๋ผ์ด๋ธŒ

https://school.programmers.co.kr/learn/courses/30/lessons/42891 ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์— ์‹ ๊ฒฝ์จ์•ผ ํ•˜๋Š” ๋ฌธ์ œ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋จน๋Š” ์‹œ๊ฐ„์ด ์งง์€ ์Œ์‹๋ถ€ํ„ฐ ํ์—์„œ ๋นผ๊ธฐ import heapq # ์šฐ์„ ์ˆœ์œ„ํ ํ™œ์šฉ: food_time์ด ์งง์€ ์Œ์‹๋ถ€ํ„ฐ ์‚ญ์ œ def solution(food_times, k): if sum(food_times) <= k: return -1 ...

Apr 4, 2024
[์ฝ”ํ…Œ] ๊ทธ๋ฆฌ๋”” ๋ฌธ์ œ - ๋ฌด์ง€์˜ ๋จน๋ฐฉ ๋ผ์ด๋ธŒ

[์ฝ”ํ…Œ] ์—ฌํ–‰๊ฒฝ๋กœ

๐Ÿ’ก [์ถœ๋ฐœ์ง€, ๋„์ฐฉ์ง€] ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง„ ๋น„ํ–‰๊ธฐ ํ‹ฐ์ผ“์„ ํ†ตํ•ด ๋ชจ๋“  ํ‹ฐ์ผ“์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ๊ณตํ•ญ์„ ๋ฐฉ๋ฌธ ์ˆœ์„œ ๊ตฌํ•˜๊ธฐ (๋‹จ, ์—ฌ๋Ÿฌ ๊ณตํ•ญ์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์•ŒํŒŒ๋ฒณ์ด ๋น ๋ฅธ ๊ณตํ•ญ๋ถ€ํ„ฐ ๋ฐฉ๋ฌธํ•œ๋‹ค.) ํ‹€๋ ธ๋˜ ์ฝ”๋“œ from collections import defaultdict def dfs(graph, route, depart): if graph[depart]: connected = graph[depart][0] ...

Feb 26, 2024
[์ฝ”ํ…Œ] ์—ฌํ–‰๊ฒฝ๋กœ

siwon.log

161 posts