[백준_Python] 1743번 - 음식물 피하기 [실버 1]

황준성·2024년 11월 29일
0

BOJ_Python

목록 보기
29/70

문제

입력

첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다. 그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다.

좌표 (r, c)의 r은 위에서부터, c는 왼쪽에서부터가 기준이다. 입력으로 주어지는 좌표는 중복되지 않는다.

출력

첫째 줄에 음식물 중 가장 큰 음식물의 크기를 출력하라.

입력 예시 1

3 4 5
3 2
2 2
3 1
2 3
1 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)
profile
Make progress

0개의 댓글