프로그래밍/Python

백준_python 1926번 그림 (DFS, BFS)

O'bin 2024. 8. 4. 18:04

<문제 링크>

https://www.acmicpc.net/problem/1926

 

<정답 코드>

 sol 1 ) deque를 이용한 BFS로 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import sys
from collections import deque
 
input = sys.stdin.readline
 
dx = [-1100]
dy = [00-11]
 
def bfs(x, y):
    q = deque([(x, y)])
    visited[x][y] = True
    size = 1
 
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < n and 0 <= ny <and graph[nx][ny] == 1 and not visited[nx][ny]:
                visited[nx][ny] = True
                q.append((nx, ny))
                size += 1
    return size
 
def main():
    global n, m, graph, visited
    n, m = map(int, input().split())
    graph = [list(map(int, input().split())) for _ in range(n)]
    visited = [[False* m for _ in range(n)]
    cnt = 0
    max_size = 0
 
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1 and not visited[i][j]:
                cnt += 1
                max_size = max(max_size, bfs(i, j))
 
    print(cnt)
    print(max_size)
 
if __name__ == "__main__":
    main()
cs

 

 

 

 sol 2 ) stack을 이용한 DFS로 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 스택을 이용한 DFS
def dfs(x, y):
    s = [(x, y)]
    visited[x][y] = True
    size = 1
 
    while s:
        x, y = s.pop()
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < n and 0 <= ny <and graph[nx][ny] == 1 and not visited[nx][ny]:
                visited[nx][ny] = True
                s.append((nx, ny))
                size += 1
    return size
cs

 

 

 

그래프 탐색 방법 잊지 않도록 꾸준히 복습해야겠다.