Algorithm

[파이썬/python] 백준 1012번 - 유기농 배추

Sean 션 2022. 12. 1. 10:54

import sys
T = int(sys.stdin.readline())
cnt = 0
ans = []


# dfs
def dfs(y, x):
    arr[y][x] = 0
    if y + 1 < N:
        if arr[y+1][x] == 1:
            dfs(y+1, x)
    if y - 1 >= 0:
        if arr[y-1][x] == 1:
            dfs(y-1, x)
    if x + 1 < M:
        if arr[y][x+1] == 1:
            dfs(y, x+1)
    if x - 1 >= 0:
        if arr[y][x-1] == 1:
            dfs(y, x-1)




for i in range(T):
    N, M, K = map(int, sys.stdin.readline().split())

    arr = [[0 for j in range(M)] for i in range(N)]

    for j in range(K):
        X, Y = map(int, sys.stdin.readline().split())
        arr[X][Y] = 1

    for n in range(N):
        for m in range(M):
            if arr[n][m] == 1:
                cnt += 1
                dfs(n, m)

    ans.append(cnt)
    cnt = 0
for i in ans:
    print(i)

그래프 이론 문제입니다.

2학기 자료구조 수업을 듣는 중이라 문제가 풀리네요.

왜 dfs를 썼냐.. 사실 bfs 써도 됩니다.

그냥 (제생각엔) dfs가 구현이 더 쉬워요.

 

구현방법:

N*M 크기의 2차원 배열을 선언하고 0으로 초기화합니다.

입력에 맞게 배추가 있는 곳을 1으로 바꿉니다.

모든 인덱스에 방문하며 dfs로 탐색하며 1인 곳이 있을 때마다 카운트 하며 방문한 곳을 0으로 바꿔줍니다.

(근거 : N, M 은 50보다 작으므로 최대 크기는 2500입니다. 시간 초과 문제는 없을겁니다.)

 

TIP:

arr = [[0 for j in range(M)] for i in range(N)]

N*M크기의 배열을 선언하며 0으로 초기화하는 코드입니다.

정말.. 간편하네요.

오늘도 하나 배워갑니다.