본문 바로가기
백준(Python) 풀이

백준 1743번. 음식물 피하기 (Python / 파이썬)

by yewonnie 2022. 4. 22.

문제

코레스코 콘도미니엄 8층은 학생들이 3끼의 식사를 해결하는 공간이다. 그러나 몇몇 비양심적인 학생들의 만행으로 음식물이 통로 중간 중간에 떨어져 있다. 이러한 음식물들은 근처에 있는 것끼리 뭉치게 돼서 큰 음식물 쓰레기가 된다. 
이 문제를 출제한 선생님은 개인적으로 이러한 음식물을 실내화에 묻히는 것을 정말 진정으로 싫어한다. 참고로 우리가 구해야 할 답은 이 문제를 낸 조교를 맞추는 것이 아니다. 
통로에 떨어진 음식물을 피해가기란 쉬운 일이 아니다. 따라서 선생님은 떨어진 음식물 중에 제일 큰 음식물만은 피해 가려고 한다. 
선생님을 도와 제일 큰 음식물의 크기를 구해서 “10ra"를 외치지 않게 도와주자.

입력

첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다.  그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다.
좌표 (r, c)의 r은 위에서부터, c는 왼쪽에서부터가 기준이다. 입력으로 주어지는 좌표는 중복되지 않는다.

출력

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

문제 풀이

음식물은 상하좌우로 인접한 것끼리 뭉쳐 큰 음식물 쓰레기가 됩니다.

따라서 제일 큰 음식물의 크기를 구해야하므로

음식물을 탐색하며 크기를 구해야합니다.

DFS 알고리즘을 사용하여 가장 큰 음식물의 크기를 구해주었습니다.

 

먼저 음식물의 위치가 입력으로 주어지므로 

해당 위치에 값을 1로 만들어주어 음식물이 있음을 표시해주었습니다.

 

그런 다음 각 통로의 위치에서 탐색을 수행해주었습니다.

만약 범위를 벗어나면 False를 반환하고

통로의 값이 1이라면 음식물이 있다는 것이므로

이미 방문했음을 표시하기 위해 0으로 만들어준 뒤

상, 하, 좌, 우로 탐색해주었습니다.

이때, 음식물의 크기를 세어주기 위해 count를 증가시켜주었습니다.

탐색이 끝나면 True를 반환하도록 해주었습니다.

 

탐색이 끝나면 구한 음식물의 크기 중 가장 큰 것을 구해주었습니다.


My Code

import sys
sys.setrecursionlimit(1000000)

def dfs(x, y):
    global count

    if x < 0 or x >= n or y < 0 or y >= m: # 범위 벗어나면 False
        return False
    
    if array[x][y] == 1: # 음식물을 만나면
        array[x][y] = 0  # 방문했음을 표시
        count += 1       # 크기를 세어줌
        # 상,하,좌,우로 탐색
        dfs(x - 1, y)
        dfs(x + 1, y)
        dfs(x, y - 1)
        dfs(x, y + 1)
        return True   # 탐색 끝나면 True 

    return False

n, m, k = map(int,input().split()) # 통로 세로, 가로, 음식물 개수

array = [[0] * m for _ in range(n)] # 통로
for _ in range(k):
    x, y = map(int,input().split()) # 음식물 위치
    array[x - 1][y - 1] = 1         # 1로 만들어줌

max_value = -1e9
for i in range(n):
    for j in range(m):
        count = 0
        dfs(i, j) # 탐색 수행
        max_value = max(max_value, count) # 음식물 크기 중 최댓값

print(max_value)

 

댓글