첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다. 그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다.
좌표 (r, c)의 r은 위에서부터, c는 왼쪽에서부터가 기준이다. 입력으로 주어지는 좌표는 중복되지 않는다.
첫째 줄에 음식물 중 가장 큰 음식물의 크기를 출력하라.
3 4 5
3 2
2 2
3 1
2 3
1 1
4
백준 2667번 - 단지번호붙이기
https://velog.io/@junseong/%EB%B0%B1%EC%A4%80Python-2667%EB%B2%88-%EB%8B%A8%EC%A7%80%EB%B2%88%ED%98%B8%EB%B6%99%EC%9D%B4%EA%B8%B0-%EC%8B%A4%EB%B2%84-1
이 문제와 로직이 똑같다. "개발자로 취직하기"의 DFS강의를 완강하고 실버 1 난이도의 문제를 풀고 있는데 색다른게 별로 없다 벌써 똑같은 문제만 두번째다. 자세한 설명은 저 문제의 설명을 보면 될 것 같다. 너무 똑같아서 굳이 두번 설명하지는 않아도 될 것 같다.
# 백준 1743 음식물 피하기
# 재귀 횟수, 읽는 속도 늘리기
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
# 방향벡터 동-서-남-북순
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def DFS(y, x):
global visited, temp_count
visited[y][x] = True
temp_count += 1
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 1 <= nx <= M and 1 <= ny <= N and graph[ny][nx] and not visited[ny][nx]:
DFS(ny, nx)
# 0. 입력 및 초기화
N, M, K = map(int, input().split()) #N세로 M가로
visited = [[False] * (M+1) for _ in range(N+1)]
graph = [[0] * (M+1) for _ in range(N+1)]
answer_list = [] # 넓이
# 1. 연결 요소 입력
for i in range(K):
# 애초에 값이 (y, x)로 입력된다
y, x = map(int, input().split())
graph[y][x] = 1
# 2. DFS호출
for i in range(1, N+1):
for j in range(1, M+1):
if graph[i][j] and not visited[i][j]:
temp_count = 0
DFS(i, j)
answer_list.append(temp_count)
# 3. 출력
if answer_list:
print(max(answer_list))
else:
print(0)