본문 바로가기
백준

1926번: 그림

by bingual 2022. 2. 26.
반응형

 

 

 

 

 

풀이

 

dfs와 bfs로 풀수 있는 문제입니다.

 

dfs

...

graph[0][0] ~ graph[n-1][m-1] 까지 돌면서 방문하지 않은 곳에서 dfs를 호출합니다.

dfs 함수 안에서 재귀로 dfs가 재호출 될 때마다 도화지에 그림이 그려진곳으로 전진한 것이므로 num을 1씩 증가해줍니다.

처음에 호출한 dfs가 끝나면 num을 area안에 넣고 마지막에 출력할 수 있도록 저장하고, 그림이 연결돼있는 도화지 구역 1개를 다 탐색한 것이므로 cnt를 1 증가시킨뒤 num을 0으로 초기화 합니다.

 

마지막에 cnt를 출력하고 area에서 가장큰 값을 출력합니다. 만약 그림이 하나도 없을 경우 0을 출력합니다.

...

 

 

bfs

...

graph[0][0] ~ graph[n-1][m-1] 까지 돌면서 방문하지 않은 곳에서 bfs를 호출합니다.

 

bfs가 호출될때마다 graph[x][y] 값을 0으로 num을 1로 초기화 합니다.

 

nx, ny로 다음 노드의 위치를 특정하고 graph[nx][ny]의 값이 1일 경우 queue에 nx,ny의 값을 넣으면 도화지에 그림이 그려진곳으로 전진한 것이므로 num을 1씩 증가해줍니다.

 

queue가 비게되면 num을 area안에 넣고 마지막에 출력할 수 있도록 저장하고, 그림이 연결돼있는 도화지 구역 1개를 다 탐색한 것이므로 cnt를 1 증가시킵니다.

 

마지막에 cnt를 출력하고 area에서 가장큰 값을 출력합니다. 만약 그림이 하나도 없을 경우 0을 출력합니다.

...

 

 

 

 

 

 

파이썬 dfs

import sys
from sys import stdin
sys.setrecursionlimit(10000000)

def dfs(x, y):
    if x < 0 or x >=n or y < 0 or y >= m:
        return False
    
    if graph[x][y] == 1:
        graph[x][y] = 0
        global num
        num += 1
        
        dfs(x - 1, y)
        dfs(x, y - 1)
        dfs(x + 1, y)
        dfs(x, y + 1)

        return True
    return False

n, m = map(int, input().split())

graph = [list(map(int, stdin.readline().split())) for _ in range(n)]
area = []

num = 0
cnt = 0
for i in range(n):
    for j in range(m):
        if dfs(i, j) == True:
            area.append(num)
            cnt += 1
            num = 0


print(cnt)
print(max(area) if area else 0)

 

 

 

 

 

파이썬 bfs

from collections import deque
from sys import stdin

def bfs(x, y):
    queue = deque()
    queue.append((x, y))
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    graph[x][y] = 0
    num = 1

    while queue:
        x, y = queue.popleft()
        
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            
            if (0 <= nx < n) and (0 <= ny < m) and graph[nx][ny] == 1:
                queue.append((nx, ny))
                graph[nx][ny] = 0
                num += 1           
                
    area.append(num)
    return

n, m = map(int, input().split())
graph = [list(map(int, stdin.readline().split())) for _ in range(n)]
area = []

cnt = 0
for i in range(n):
    for j in range(m):
        if graph[i][j] == 1:
            bfs(i, j)
            cnt += 1
            
print(cnt)
print(max(area) if area else 0)

'백준' 카테고리의 다른 글

2468번: 안전 영역  (0) 2022.02.27
14716번: 현수막  (0) 2022.02.27
10989번: 수 정렬하기 3  (0) 2022.02.26
2751번: 수 정렬하기 2  (0) 2022.02.26
2178번: 미로 탐색  (0) 2022.02.24