문제 링크 >> https://www.acmicpc.net/problem/1743
📋 문제
코레스코 콘도미니엄 8층은 학생들이 3끼의 식사를 해결하는 공간이다.
그러나 몇몇 비양심적인 학생들의 만행으로 음식물이 통로 중간 중간에 떨어져 있다.
이러한 음식물들은 근처에 있는 것끼리 뭉치게 돼서 큰 음식물 쓰레기가 된다.
이 문제를 출제한 선생님은 개인적으로 이러한 음식물을 실내화에 묻히는 것을 정말 진정으로 싫어한다.
참고로 우리가 구해야 할 답은 이 문제를 낸 조교를 맞추는 것이 아니다.
통로에 떨어진 음식물을 피해가기란 쉬운 일이 아니다.
따라서 선생님은 떨어진 음식물 중에 제일 큰 음식물만은 피해 가려고 한다.
선생님을 도와 제일 큰 음식물의 크기를 구해서 “10ra"를 외치지 않게 도와주자.
👉 입력
첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다.
그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다.
좌표 (r, c)의 r은 위에서부터, c는 왼쪽에서부터가 기준이다.
입력으로 주어지는 좌표는 중복되지 않는다.
👈출력
첫째 줄에 음식물 중 가장 큰 음식물의 크기를 출력하라.
📝 풀이
import sys
sys.setrecursionlimit(10000)
def dfs(x, y):
global count
if x < 0 or x >= n or y < 0 or y >= m:
return
if arr[x][y] == 0:
return
if arr[x][y] == 1:
count += 1
arr[x][y] = 0
dfs(x-1, y)
dfs(x, y-1)
dfs(x+1, y)
dfs(x, y+1)
n, m, k = map(int, sys.stdin.readline().split())
arr = [[0]*m for _ in range(n)]
for _ in range(k):
r, c = map(int, sys.stdin.readline().split())
arr[r-1][c-1] = 1
result = []
for x in range(n):
for y in range(m):
if arr[x][y] == 1:
count = 0
dfs(x, y)
result.append(count)
print(max(result))
백준 1012번 유기농 배추와 거의 비슷한 문제였다.
유기농 배추에서는 뭉칠 수 있는 배추들의 개수를 세는 것이었다면 음식물 피하기 문제는 뭉칠 수 있는 음식물의 크기가 제일 큰 것을 찾는 것이다.
따라서 dfs를 이용해 해당 음식물의 상하좌우에 더이상 음식물이 없을 때까지 탐색한다.
이때 상하좌우에 음식물이 존재한다면 음식물의 수를 센다.
그리고 방문한 음식물은 0으로 바꾸어 방문처리 한다.
dfs() 함수가 끝나면 count는 어떤 음식물에서 시작해 뭉칠 수 있는 음식물의 개수가 저장된다.
따라서 이들을 result라는 리스트에 저장하고 제일 큰 값을 출력한다.
이번에도 sys.setrecursionlimit(10000)
을 주지 않으면 런타임에러가 난다.
'Algorithm > Python' 카테고리의 다른 글
[프로그래머스] 네트워크 (0) | 2022.02.27 |
---|---|
[백준 2468번] 안전 영역 (0) | 2022.02.27 |
[백준 1325번] 효율적인 해킹 (0) | 2022.02.24 |
[백준 1012번] 유기농 배추 (0) | 2022.02.24 |
[백준 1260번] DFS와 BFS (0) | 2022.02.24 |
댓글