DFS with Python

유건우·2024λ…„ 9μ›” 20일

μ½”ν…Œμ€€λΉ„

λͺ©λ‘ 보기
11/13
post-thumbnail

πŸ’‘λ¬Έμ œμ„€λͺ…

문제 : https://www.acmicpc.net/problem/4963

  • μ •μ‚¬κ°ν˜•μœΌλ‘œ 이루어져 μžˆλŠ” 섬과 λ°”λ‹€ 지도가 μ£Όμ–΄μ§„λ‹€. μ„¬μ˜ 개수λ₯Ό μ„ΈλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

  • ν•œ μ •μ‚¬κ°ν˜•κ³Ό κ°€λ‘œ, μ„Έλ‘œ λ˜λŠ” λŒ€κ°μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” μ‚¬κ°ν˜•μ€ κ±Έμ–΄κ°ˆ 수 μžˆλŠ” μ‚¬κ°ν˜•μ΄λ‹€.
  • 두 μ •μ‚¬κ°ν˜•μ΄ 같은 섬에 있으렀면, ν•œ μ •μ‚¬κ°ν˜•μ—μ„œ λ‹€λ₯Έ μ •μ‚¬κ°ν˜•μœΌλ‘œ κ±Έμ–΄μ„œ 갈 수 μžˆλŠ” κ²½λ‘œκ°€ μžˆμ–΄μ•Ό ν•œλ‹€. μ§€λ„λŠ” λ°”λ‹€λ‘œ λ‘˜λŸ¬μ‹Έμ—¬ 있으며, 지도 λ°–μœΌλ‘œ λ‚˜κ°ˆ 수 μ—†λ‹€.



μž…λ ₯

  • μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€.
  • 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” μ§€λ„μ˜ λ„ˆλΉ„ w와 높이 hκ°€ μ£Όμ–΄μ§„λ‹€.
  • w와 hλŠ” 50보닀 μž‘κ±°λ‚˜ 같은 μ–‘μ˜ μ •μˆ˜μ΄λ‹€.
  • λ‘˜μ§Έ 쀄뢀터 h개 μ€„μ—λŠ” 지도가 μ£Όμ–΄μ§„λ‹€. 1은 λ•…, 0은 바닀이닀.
  • μž…λ ₯의 λ§ˆμ§€λ§‰ μ€„μ—λŠ” 0이 두 개 μ£Όμ–΄μ§„λ‹€.



좜λ ₯

  • 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, μ„¬μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.




❓DFS에 λŒ€ν•΄

  • Depth-First Search, 깊이 μš°μ„  탐색이라고도 λΆˆλ¦½λ‹ˆλ‹€.
  • κ·Έλž˜ν”„μ—μ„œ κΉŠμ€ 뢀뢄을 μš°μ„ μ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.


  • DFS μ•Œκ³ λ¦¬μ¦˜ νƒμƒ‰μž…λ‹ˆλ‹€.
  • BFS μ•Œκ³ λ¦¬μ¦˜ νƒμƒ‰μž…λ‹ˆλ‹€.



λ™μž‘κ³Όμ •

  • 1. 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό μŠ€νƒμ— μ‚½μž…ν•˜κ³  λ°©λ¬Έ 처리λ₯Ό ν•©λ‹ˆλ‹€.
  • 2 - 1. μŠ€νƒμ˜ μ΅œμƒλ‹¨ λ…Έλ“œμ— λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œκ°€ 있으면 κ·Έ 인접 λ…Έλ“œλ₯Ό μŠ€νƒμ— λ„£κ³  방문처리λ₯Ό ν•©λ‹ˆλ‹€.
  • 2 - 2. λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œκ°€ μ—†μœΌλ©΄ μŠ€νƒμ—μ„œ μ΅œμƒλ‹¨ λ…Έλ“œλ₯Ό κΊΌλƒ…λ‹ˆλ‹€.
  • 2 번 과정을 더 이상 μˆ˜ν–‰ν•  수 없을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•©λ‹ˆλ‹€.




πŸ§‘β€πŸ’» μ½”λ“œ 풀이

DFS

def dfs(x, y):
    if x == m or y == n:
        return board

    for i in range(8):
        nx, ny = x + dx[i], y + dy[i]
        if 0 <= nx < m and 0 <= ny < n and board[nx][ny] == 1:
            board[nx][ny] = 0
            dfs(nx, ny)




solution

while (True):
    n, m = map(int, sys.stdin.readline().split())
    if n == 0 and m == 0:
        break

    board = []
    answer = 0
    for i in range(m):
        board.append(list(map(int, sys.stdin.readline().split())))

    for i in range(m):
        for j in range(n):
            if board[i][j] == 1:
                dfs(i, j)
                answer += 1

    print(answer)




전체 μ½”λ“œ

import sys
sys.setrecursionlimit(10000)
dx = [0, 1, 1, 1, 0, -1, -1, -1]
dy = [1, 1, 0, -1, -1, -1, 0, 1]

board = []

def dfs(x, y):
    if x == m or y == n:
        return board

    for i in range(8):
        nx, ny = x + dx[i], y + dy[i]
        if 0 <= nx < m and 0 <= ny < n and board[nx][ny] == 1:
            board[nx][ny] = 0
            dfs(nx, ny)

while (True):
    n, m = map(int, sys.stdin.readline().split())
    if n == 0 and m == 0:
        break

    board = []
    answer = 0
    for i in range(m):
        board.append(list(map(int, sys.stdin.readline().split())))

    for i in range(m):
        for j in range(n):
            if board[i][j] == 1:
                dfs(i, j)
                answer += 1

    print(answer)
profile
βœ…Β μ λ‹Ήν•œ 좔상화λ₯Ό μ°Ύμ•„κ°€λŠ” κ°œλ°œμžμž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€